1. ホーム
  2. regex

[解決済み] 正規表現で「この文字列までなら何でもあり」にマッチさせるには?

2022-03-14 18:38:59

質問

この正規表現を例にとります。 /^[^abc]/ . これは、a,b,c以外の文字列の先頭にある任意の1文字にマッチします。

を追加した場合 * の後に /^[^abc]*/ - を指定すると、正規表現はその後に続く各文字を結果に追加し続けます。 a , または b , または c .

例えば、ソース文字列 "qwerty qwerty whatever abc hello" にマッチします。 "qwerty qwerty wh" .

しかし、マッチする文字列を "qwerty qwerty whatever "

...言い換えれば、どのようにすれば 正確な順序 "abc" ?

解決方法は?

使用している正規表現が明記されていませんが、これは は、最も一般的なもので、完全なものと見なせるものであれば、どれでも動作します。

/.+?(?=abc)/

仕組み

.+? の欲のないバージョンです。 .+ (1つ以上の 何でも)。を使うときは .+ は、基本的にすべてマッチします。 そして、もし正規表現に何か他のものがあれば、次のステップに進みます。 にマッチングさせようとする。これは 欲張り の挙動を示します。 意味 を満たすために、できるだけ多くの .

を使用する場合 .+? というように、一度にマッチングして戻ってくるのではなく 他の条件がある場合、エンジンは次の文字に順次マッチします。 正規表現の後続の部分にマッチするまで (もしあれば) ステップする。 これは 欲のない という意味で、マッチ をできるだけ少なくして 満たす .

/.+X/  ~ "abcXabcXabcX"        /.+/  ~ "abcXabcXabcX"
          ^^^^^^^^^^^^                  ^^^^^^^^^^^^

/.+?X/ ~ "abcXabcXabcX"        /.+?/ ~ "abcXabcXabcX"
          ^^^^                          ^

それに続くのは (?= {contents} ) , a ゼロ幅 アサーション , a 見て回る . このグループ化された構造は、その の内容は、マッチした文字としてカウントされません ( 幅ゼロ ). また は、マッチするかどうかだけを返します ( アサーション ).

したがって、他の言葉で言えば、正規表現 /.+?(?=abc)/ を意味します。

任意の文字を、"abc"が見つかるまで、できるだけ少なくマッチングさせる。 abc"をカウントしない。