4

これらの文字列があります(すべての行を個別にチェックします):

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx

admin今、私はで始まり、で終わらないものに一致させたいEx(大文字と小文字を区別しない)

したがって、正規表現を適用した後、一致する必要があります:

adminUpdate
adminEditXe
adminExclude

私の現在の正規表現/^admin[a-z]+(?!ex)$/giadmin

4

2 に答える 2

8

ちょっとした変更:

/^admin[a-z]+(?<!ex)$/gi
               ^

先読みを後読みに変えます。

現在の形で説明するのはかなり難しいです。$基本的に、正規表現が一致するには文字列の最後に到達する必要があり、それが発生(?!ex)すると文字列の最後にあるため、先に何も見えません。ただし、文字列の末尾にいるため、後読みを使用し(?<!ex)て文字列が で終わるかどうかを確認exできます。

ルックアラウンドはゼロ幅であるため、意味を変更せずに(?<!ex)andの位置を入れ替えることができます (ただし、エンジンが一致する文字列を検索する方法は変わります)。$

/^admin[a-z]+$(?<!ex)/gi

このように書くのは直観に反しますが、私の主張がどこに向かうのかを簡単に理解できます。

別の見方をすると、(?!ex)$はゼロ幅のアサーションであるため、同じ位置でチェックされ、文字列の最後にあるということは、$ 前方に何も表示されないことを意味します。

于 2015-01-08T07:29:36.477 に答える
3
^(?!.*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);
于 2015-01-08T07:31:07.243 に答える