【发布时间】:2018-05-10 13:22:50
【问题描述】:
我想检查字符串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
【问题讨论】:
-
单独检查所有名称部分:
selection.split(" ").all?{|name| str.include?(name)} -
@SergioTulentsev 我需要一个正则表达式解决方案,因为最终我必须把它放在一个需要正则表达式的 Mongoid 查询中。
-
使用前瞻:
^(?=.*John)(?=.*Zeni) -
为什么使用
Regexp.quote?你有特殊的字符需要说明吗? -
“需要正则表达式。” - 不必要。即使在 mongodb 中,您也可以将单个子句与
$and