2つの名前を任意の順序で含む文字列に一致する正規表現


180

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

何かのようなもの

ジャックアンドジェームズ

次の文字列に同意する

  • 「こんにちはジャックジェームズです

  • 「こんにちはジェームズジャックです



@AndersonGreen、質問は時期尚早にロックされました。ほとんどの正規表現はルックアラウンドモード数量詞を認識しないため、これらのソリューションは実行可能ではないため、答えは非常に不足しています。質問された時点で数量詞が存在していたと思います。
XPMai

回答:


261

ルックアラウンドを使用してチェックを行うことができます:

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

試して。

このアプローチには、複数の条件を簡単に指定できるという利点があります。

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

18
この例がどのように機能するかをもう少し詳しく説明してもらえますか?
bjmc 14

2
vim構文:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$または\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal 2014

'#'で始まる文字列を検索しようとすると、なぜこれが(少なくともJavaScriptで)壊れるのか誰か知っていますか?^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$一致しなかったblah #tgif blah #friday blahが、^(?=.*\bfriday\b)(?=.*\btgif\b).*$罰金を動作します。
btleffler 2015

2
\bここはどういう意味ですか?
VarunAgw


106

試してください:

james.*jack

同時に両方が必要な場合は、次のorようにします。

james.*jack|jack.*james

1
受け入れられた答えはうまくいきました。これも完璧に機能しました。Visual Studioの「検索結果」でコードを検索するため。
ヨーグルトザワイズ

1
これは私にとってはうまくいき、受け入れられた答えよりもはるかに簡潔で理解しやすいです!
Kumar Manish 2017

1
一致する名前が2つしかないソリューションが必要だったので、この答えはその場合により簡潔になります。しかし、「or」の数が階乗的に増加するため、受け入れられる答えは2よりも簡潔になります。3名の6「または」Sが存在するであろう、4名等24「または」S、あろう
WileCau

怠惰にすることをお勧めしjames.*?jack|jack.*?jamesます。これは大きなテキストに役立ちます。
Jekis

42

これから書くコマンドの説明:-

. 任意の文字を意味し、の代わりに数字を使用できます。

* 直前に書かれたもののゼロ個以上の出現を意味します。

|「または」を意味します。

そう、

james.*jack

検索しjamesjackが来るまで任意の数の文字を検索します。

またはあなたが欲しいのでjack.*jamesjames.*jack

したがって、コマンド

jack.*james|james.*jack

7
余談ですが、@ icyrockの回答を編集することもできます(これは、6年前の自分の回答と同じです)。あなた自身の説明は非常に役に立ちます。
WoJ 2018年

2
この回答をありがとうございます。ただし、VSCode検索では、回答ジャックであることを指摘する必要があります 。* james | james。* jackは '|'の間のスペースを取ります (または)検索時に考慮される記号。jack。* james | james。* jackは機能し、スペースを探し
ません

2
IF $ _explanation === "awesome" THEN return $ THUMBS_UP ENDIF;
Syed Aqeel



2

Vimには、\&任意の順序で単語のセットを含む行を検索するときに役立つ分岐演算子があります。さらに、必要な単語のセットを拡張することは簡単です。

例えば、

/.*jack\&.*james

jackand を含む行jamesに任意の順序で一致します。

使用法の詳細については、この回答を参照してください。分岐を実装する他の正規表現の種類については知りません。オペレーターは、正規表現のウィキペディアのエントリにも記載されていません。


2

方法1:One jackand Onejames

念のため、2つjackまたは2つjamesは許可されずjack、1つだけjamesが有効になるため、次のような式を設計できます。

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

ここでは、これらのステートメントを使用して、これらのペアインスタンスを除外します。

(?!.*\bjack\b.*\bjack\b)

そして、

(?!.*\bjames\b.*\bjames\b)

RegExデモ1

それを単純化して

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

RegExデモ2


式を簡略化/変更/探索する場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。


RegEx回路

jex.imは正規表現を視覚化します。

ここに画像の説明を入力してください

テスト

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


方法2:ワンjackとワンjames特定の順序で

次のように、first jameslastにも設計できますjack

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

RegExデモ3

およびその逆:

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

RegExデモ4


0

常にサポートされているとは限らないため、正規表現の数量詞機能を利用できlookaroundます。

(\b(james|jack)\b.*){2,}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.