3

文字列に任意の順序で2つの単語が含まれている場合に一致する正規表現をどのように記述しますか?

つまり、大文字と小文字を区別せずに、「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は2番目のアサーションを処理します。

この場合、2番目の部分はアサーション形式で必ずしも必要ではないことに注意してください。次のコードは、意図したとおりに機能します。

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

1つの正規表現でそれを行うことを主張しない方がエレガントだと思いますが、2つ実行します。

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

include?正規表現の@alestanisと@sawaに+1しますが、単純なものを使用した場合、意図が明確になりませんか。

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

私の$0.02

于 2012-12-06T18:24:53.363 に答える