これらの文字列があります(すべての行を個別にチェックします):
adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
admin
今、私はで始まり、で終わらないものに一致させたいEx
(大文字と小文字を区別しない)
したがって、正規表現を適用した後、一致する必要があります:
adminUpdate
adminEditXe
adminExclude
これらの文字列があります(すべての行を個別にチェックします):
adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
admin
今、私はで始まり、で終わらないものに一致させたいEx
(大文字と小文字を区別しない)
したがって、正規表現を適用した後、一致する必要があります:
adminUpdate
adminEditXe
adminExclude
ちょっとした変更:
/^admin[a-z]+(?<!ex)$/gi
^
先読みを後読みに変えます。
現在の形で説明するのはかなり難しいです。$
基本的に、正規表現が一致するには文字列の最後に到達する必要があり、それが発生(?!ex)
すると文字列の最後にあるため、先に何も見えません。ただし、文字列の末尾にいるため、後読みを使用し(?<!ex)
て文字列が で終わるかどうかを確認ex
できます。
ルックアラウンドはゼロ幅であるため、意味を変更せずに(?<!ex)
andの位置を入れ替えることができます (ただし、エンジンが一致する文字列を検索する方法は変わります)。$
/^admin[a-z]+$(?<!ex)/gi
このように書くのは直観に反しますが、私の主張がどこに向かうのかを簡単に理解できます。
別の見方をすると、(?!ex)
と$
はゼロ幅のアサーションであるため、同じ位置でチェックされ、文字列の最後にあるということは、$
前方に何も表示されないことを意味します。
^(?!.*Ex$)admin.*$
これを試してください。デモをご覧ください。
https://regex101.com/r/sH8aR8/23
$re = ""^(?!.*Ex$)admin.*$"m";
$str = "adminUpdate\nadminDeleteEx\nadminEditXe\nadminExclude\nlistWebsite\nlistEx";
preg_match_all($re, $str, $matches);