Ruby regex用于以任何顺序出现在字符串中的两个单词

时间:2012-12-06 15:58:38

标签: ruby regex

如果字符串中出现任何两个单词,如何以任何顺序编写正则表达式以匹配?

是的,我正在尝试编写一个正则表达式,它会找到任何带有“reset”和“password”的字符串,不区分大小写。所以,这些应该匹配:

  • 重置密码
  • 密码重置
  • 您重置密码
  • 您的密码重置请求
  • 您的密码已重置

这些不应该匹配

  • 密码
  • 重置
  • 密码已更改
  • 帐户重置

我得到的最接近的是/(password|reset)/,但是找到了所有情况,当我尝试(password|reset){2}时,它与任何情况都不匹配。在rubular上进行测试。

5 个答案:

答案 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}