Method: Doing::StringQuery#to_rx

Defined in:
lib/doing/string/query.rb

#to_rx(distance: nil, case_type: nil) ⇒ Regexp

Convert string to fuzzy regex. Characters in words can be separated by up to distance characters in haystack, spaces indicate unlimited distance.

Examples:

"this word".to_rx(3)
# => /t.{0,3}h.{0,3}i.{0,3}s.{0,3}.*?w.{0,3}o.{0,3}r.{0,3}d/

Parameters:

  • distance (Integer) (defaults to: nil)

    Allowed distance between characters

  • case_type (defaults to: nil)

    The case type

Returns:

  • (Regexp)

    Regex pattern



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/doing/string/query.rb', line 63

def to_rx(distance: nil, case_type: nil)
  distance ||= Doing.config.fetch('search', 'distance', 3).to_i
  case_type ||= Doing.config.fetch('search', 'case', 'smart')&.normalize_case
  case_sensitive = case case_type
                   when :smart
                     self =~ /[A-Z]/ ? true : false
                   when :sensitive
                     true
                   else
                     false
                   end

  pattern = case dup.strip
            when %r{^/.*?/$}
              sub(%r{/(.*?)/}, '\1')
            when /^'/
              sub(/^'(.*?)'?$/, '\1')
            else
              split(/ +/).map do |w|
                w.split('').join(".{0,#{distance}}").gsub(/\+/, '\+').wildcard_to_rx
              end.join('.*?')
            end
  Regexp.new(pattern, !case_sensitive)
end