54

次の文字列を想定します。

aaa bbb ccc
bbb aaa ccc

aaa文字列の先頭でない限り、一致させたいです。私は次のようなことをしてそれを否定しようとしています:

[^^]aaa

しかし、これは正しくないと思います。を使用してpreg_replaceいます。

4

6 に答える 6

91

後方確認を使用して、先頭にないことを確認できます。(?<!^)aaa

于 2013-03-27T21:11:40.133 に答える
38

私は Google 検索でここに来て、後読みを使用しないソリューションに興味があったので、ここに私の 2 セントを示します。

パターンは、文字列内の任意の場所の3[^^]aaa以外の文字に一致します。は、特殊文字とは見なされない否定文字クラスです。直後にある最初のものは否定を表すので特別であり、2番目のものは文字通りのキャレット記号であることに注意してください。^a[^...]^^[

したがって、文字列の開始を示すために a^を内部に含めることはできません。[...]

解決策は、否定的なルックアラウンドを使用することです。これら 2 つは同じように機能します。

(?<!^)aaa

そして先読み:

(?!^)aaa

先読みも機能するのはなぜですか?ルックアラウンドはゼロ幅のアサーションであり、アンカーもゼロ幅です。テキストを消費しません。文字通り(?<!^)、現在の位置のすぐ左に文字列の開始位置(?!^)がないかどうかをチェックし、現在の位置のすぐ右に文字列の開始位置がないかどうかをチェックします。同じ場所がチェックされているため、両方がうまく機能します。

于 2017-04-05T13:28:31.293 に答える
16

後読みを使用したくない場合は、次の正規表現を使用します。

/.(aaa)/

そして使用しますmatched group # 1

于 2013-03-27T21:20:06.503 に答える
3

これは、探しているものを見つけるために機能します。

(?<!^)aaa

使用例: http://regexr.com?34ab2

于 2013-03-27T21:20:10.167 に答える