我想检查字符串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
答案 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
标记。
注意:订单并不重要。