1. ホーム
  2. regex

[解決済み】2つの名前を任意の順序で含む文字列をマッチさせる正規表現

2022-04-01 10:39:35

質問

正規表現で論理的なANDが必要です。

のようなものです。

ジャックとジェームス

以下の文字列に同意する

  • ハイ ジャック 以下は ジェームス '

  • 「ハイ ジェームス 以下は ジャック '

解決方法は?

を使用してチェックすることができます。 正のルックアヘッド . 以下は、このサイトに掲載されている要約です。 正規表現.info :

<ブロッククオート

lookaheadとlookbehindは、総称して「見回し」と呼ばれていますが、これは 長さ0のアサーション...lookaroundは実際に文字をマッチングするが は、マッチングをあきらめ、マッチするかしないかの結果だけを返す。 これが「アサーション」と呼ばれる所以である。これらは 文字列中の文字が一致するかどうかだけを主張します。 である。

そして、正のルックアヘッドは次のように説明されています。 アサート を使わずに、その後に続くものがある特定の式にマッチすること。 を取る の文字が含まれます。

そこで、フレーズがマッチすることを主張するために、後続の2つのポスティブ・ルックヘッドを使用する式を以下に示します。 jackjames のどちらかを選択します。

^(?=.*\bjack\b)(?=.*\bjames\b).*$

テストしてください。

で始まる括弧内の式は ?= は正のルックヘッドである。パターンを分解してみる。

  1. ^ は、マッチする式の開始をアサートします。
  2. (?=.*\bjack\b) は最初の肯定的な先読みを意味し、その後に続くものが .*\bjack\b .
  3. .* は、任意の文字が0回以上繰り返されることを意味します。
  4. \b は、任意の単語境界(空白、表現の開始、表現の終了など)を意味します。
  5. jack は文字通り、この4文字が並んでいるものです。 james を、次の正のルックアヘッドで表示します)。
  6. $ は、式の末尾にマッチしたことを表明します。

つまり、最初のルックヘッドは、"続くもの(それ自体はルックヘッドでもルックビハインドでもない)は、0個以上の任意の文字で始まり、単語境界が続く式でなければならず、次に jack と別の単語境界," そして2つ目の先読みは "次のものは、0個以上の任意の文字で始まり、単語境界が続く式でなければならず、次に james という2つの単語境界があります。 .* は単純に任意の文字に0回以上マッチし $ は、式の末尾にマッチする。

"何々で始まり、jack または james で終わり、何々で終わる" は、最初のルックヘッドを満たしますが、その後にいくつかの文字があるため、単語 jack を含む)であるため、2つ目のルックヘッドを満たします。 jack という単語は、2つ目のルックヘッドを満たすために必要ではありません。 james . どちらのルックヘッドも式の終わりを主張しないので .* のように、ルックヘッドを満足させる範囲を超えることができる。

お分かりいただけたと思いますが、念のため、以下は jackjames を逆にした場合、つまり "anythingで始まり、jamesまたはjackで終わり、anything" で終わる場合、その後に文字数があるので最初の見栄えを満たします。 james を含む)であるため、2つ目のルックヘッドを満たします。 james という単語は、2つ目のルックヘッドを満たすために必要ではありません。 jack . 先ほどと同様に、どちらのルックヘッドも式の終わりを主張しないので .* のように、ルックヘッドが満足する範囲を超えることができます。

この方法は、複数の条件を簡単に指定できるという利点がある。

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$