匹配字符串中的多个单词

时间:2018-05-09 19:37:45

标签: ruby regex

我想检查字符串selection中的所有单词是否都出现在另一个字符串中。将有任意数量的单词。这不是OR。所有单词必须出现在匹配器中。订单无关紧要。例如,当selection"John Zeni"时,它必须与" John Paul Zeni"匹配,因为"John""Zeni"都在匹配器中。如果selection只是"John",那么它应该匹配,但由于有多个单词,所有单词必须匹配。需要正则表达式解决方案。

这就是我的尝试:

selection = "John Zeni"
pattern = selection.split(" ").join("|")
# => "John|Zeni"
/#{Regexp.quote(pattern)}/
# => /John\|Zeni/ 
" John Paul Zeni".match(/#{Regexp.quote(pattern)}/)
# => nil 

为什么不匹配?我认为问题在于Regexp.quote。重要的是两个单词在匹配器中匹配。这也不应该匹配:

" John Paul Zeni" =~ /(John|Zach)/ 
# => 1

2 个答案:

答案 0 :(得分:4)

("John Zeni".split - "John Paul Zeni".split).empty?
  #=> true

如果str可能包含标点符号,我们应该在拆分之前删除这些字符。

("John Zeni Lola".split - "John Lola Paul, Zeni.".gsub(/[[:punct:]]/,'').split).empty?
  #=> true

答案 1 :(得分:1)

使用正向前瞻来模拟AND

string = "Paul Zach"
re = '^(?=.*' + string.split(/\s+/).map{ |x| Regexp.quote(x) }.join(')(?=.*') + ')'
"John Paul Mak Zach Jack Zen" =~ /#{re}/

如果需要通过多行匹配,请启用m标记或使用[\s\S]代替.。您可以确保单词不在其他单词中使用\b标记。

注意:订单并不重要。