如果字符串中出现任何两个单词,如何以任何顺序编写正则表达式以匹配?
是的,我正在尝试编写一个正则表达式,它会找到任何带有“reset”和“password”的字符串,不区分大小写。所以,这些应该匹配:这些不应该匹配
我得到的最接近的是/(password|reset)/
,但是找到了所有情况,当我尝试(password|reset){2}
时,它与任何情况都不匹配。在rubular上进行测试。
答案 0 :(得分:11)
你可以尝试
(password.*reset|reset.*password)
答案 1 :(得分:6)
使用零宽度正向前瞻断言,您可以将其编写为以下形式:
/(?=.*\breset\b)(?=.*\bpassword\b)/i
处理完第一个断言后,其匹配位置不会改变,仍然是字符串的开头。之后,ruby处理第二个断言。
请注意,在这种情况下,断言形式并不总是需要第二部分。以下代码可以按照您的意图运行。
/(?=.*\breset\b).*\bpassword\b/i
答案 2 :(得分:3)
我认为不坚持使用一个正则表达式更优雅,但做两个:
string =~ /\bpassword\b/i and string =~ /\breset\b/i
答案 3 :(得分:1)
+1给@alestanis和@sawa正则表达式,但如果你选择一个简单的include?
,它不会让意图更清晰,例如
(str.downcase.include? 'password') && (str.downcase.include? 'reset')
我的$ 0.02
答案 4 :(得分:1)
对于任意数量的单词的更通用的解决方案:
def match_all? str, words
words.all? {|w| str =~ /\b#{ Regexp.quote w }\b/i }
end
match_all? 'Your password reset request', %w{password reset}