Given a search phrase like “one two three”, I want to search a list of
text strings for onex that contain ALL of those words, but not
necessarily in that order.
The hard part for me is the “not necessarily in that order”.
Using ‘\b(one|two|three)\b’ will match if at least one of them occurs in
any order, but I need all of them to match and be in any order.
two one three => match
one three => does not match
Any ideas? Is this possible with regular expressions?
Given a search phrase like “one two three”, I want to search a list of
text strings for onex that contain ALL of those words, but not
necessarily in that order.
You can use look-aheads to build a re that looks like:
/^(?=.\bone\b)(?=.\btwo\b)(?=.*\bthree\b)/
ensuring a match only if all look-ahead assertions pass.
phrase = “one two three”
re = %r/^#{phrase.split.map{|s|“(?=.*\b#{s}\b)”}}/
while DATA.gets
print if ~re
end END
one two three YUP
one three two YUP
zone two three NOPE
three and two and one YUP
two one three => match
one three => does not match
Any ideas? Is this possible with regular expressions?
Thanks!
Jeff
stupid - but works
harp:~ > cat a.rb
strings = <<-txt
two one three
one three
one foo two bar three
foo two bar one three
two
txt
atoms = '\b(?:one|two|three)\b'
re = %r/(?:#{ atoms }).*(?:#{ atoms }).*(?:#{ atoms })/
require "yaml" and strings.each{|string| y string => (string =~ re
? true : false)}
harp:~ > ruby a.rb
---
" two one three\n": true
---
" one three\n": false
---
" one foo two bar three\n": true
---
" foo two bar one three\n": true
---
" two\n": false
hth.
-a
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.