次の正規表現を考えてみましょう: 。これは、 a、b、またはc/^[^abc]/
を除く、文字列の先頭の任意の 1 文字と一致します。
*
の後にを追加すると、正規表現は、、、またはのいずれか/^[^abc]*/
に出会うまで、後続の各文字を結果に追加し続けます。a
b
c
たとえば、ソース文字列 の場合"qwerty qwerty whatever abc hello"
、式は まで一致します"qwerty qwerty wh"
。
しかし、一致する文字列を にしたい場合はどうすればよいでしょうか"qwerty qwerty whatever "
?
言い換えれば、正確なシーケンス "abc"
まで(ただしシーケンスを含まない)すべてを一致させるにはどうすればよいでしょうか?
ベストアンサー1
使用している正規表現の種類を指定していませんが、これは「完全」と見なせる最も一般的な正規表現のいずれかで機能します。
/.+?(?=abc)/
使い方
部分は、(1 つ以上の何か).+?
の非貪欲バージョンです。 を使用すると、エンジンは基本的にすべてに一致します。その後、正規表現に何か他のものがある場合は、次の部分に一致しようとしてステップを戻します。これは貪欲な動作であり、を可能な限り満たすことを意味します。.+
.+
を使用する場合.+?
、一度にすべてを一致させてから他の条件 (ある場合) に戻るのではなく、エンジンは正規表現の後続の部分が一致するまで (ある場合)、次の文字を step ごとに一致させます。これは非貪欲な であり、を満たすために可能な限り少ない文字と一致させることを意味します。
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX"
^^^^^^^^^^^^ ^^^^^^^^^^^^
/.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX"
^^^^ ^
それに続いて、ゼロ幅アサーション、つまり、周囲を見回す があります。このグループ化された構造は、その内容と一致しますが、一致した文字としてはカウントされません (ゼロ幅)。一致するかどうかのみを返します (アサーション)。(?=
{contents}
)
つまり、正規表現は次のように/.+?(?=abc)/
意味します。
「abc」が見つかるまで、できるだけ少ない文字を一致させます(「abc」は数えません)。