次の文字列を想定します。
aaa bbb ccc
bbb aaa ccc
aaa
文字列の先頭でない限り、一致させたいです。私は次のようなことをしてそれを否定しようとしています:
[^^]aaa
しかし、これは正しくないと思います。を使用してpreg_replace
います。
次の文字列を想定します。
aaa bbb ccc
bbb aaa ccc
aaa
文字列の先頭でない限り、一致させたいです。私は次のようなことをしてそれを否定しようとしています:
[^^]aaa
しかし、これは正しくないと思います。を使用してpreg_replace
います。
後方確認を使用して、先頭にないことを確認できます。(?<!^)aaa
私は Google 検索でここに来て、後読みを使用しないソリューションに興味があったので、ここに私の 2 セントを示します。
パターンは、文字列内の任意の場所の3[^^]aaa
以外の文字に一致します。は、特殊文字とは見なされない否定文字クラスです。直後にある最初のものは否定を表すので特別であり、2番目のものは文字通りのキャレット記号であることに注意してください。^
a
[^...]
^
^
[
したがって、文字列の開始を示すために a^
を内部に含めることはできません。[...]
解決策は、否定的なルックアラウンドを使用することです。これら 2 つは同じように機能します。
(?<!^)aaa
そして先読み:
(?!^)aaa
先読みも機能するのはなぜですか?ルックアラウンドはゼロ幅のアサーションであり、アンカーもゼロ幅です。テキストを消費しません。文字通り(?<!^)
、現在の位置のすぐ左に文字列の開始位置(?!^)
がないかどうかをチェックし、現在の位置のすぐ右に文字列の開始位置がないかどうかをチェックします。同じ場所がチェックされているため、両方がうまく機能します。
後読みを使用したくない場合は、次の正規表現を使用します。
/.(aaa)/
そして使用しますmatched group # 1
。