3

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

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

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

这些不应该匹配

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

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

4

5 回答 5

11

你可以试试

(password.*reset|reset.*password)
于 2012-12-06T16:00:16.780 回答
7

使用零宽度正向预测断言,您可以将其编写为以下形式:

/(?=.*\breset\b)(?=.*\bpassword\b)/i

处理完第一个断言后,它的匹配位置没有改变,仍然是字符串的开头。之后,ruby 处理第二个断言。

请注意,在这种情况下,第二部分并不总是必须以断言形式出现。以下代码按您的预期工作。

/(?=.*\breset\b).*\bpassword\b/i
于 2012-12-06T20:50:22.943 回答
3

我认为不坚持用一个正则表达式来做,而是做两个更优雅:

string =~ /\bpassword\b/i and string =~ /\breset\b/i
于 2012-12-06T16:32:49.577 回答
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}
于 2012-12-06T19:16:24.673 回答
1

+1 到 @alestanis 和 @sawa 的正则表达式,但如果你用一个简单的,它不会让意图更清晰include?,例如

(str.downcase.include? 'password') && (str.downcase.include? 'reset')

我的 0.02 美元

于 2012-12-06T18:24:53.363 回答