我有这些字符串(分别检查每一行):
adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
现在我希望匹配以admin
开头但不以Ex
结尾的任何内容(不区分大小写)
因此在应用正则表达式之后我必须匹配:
adminUpdate
adminEditXe
adminExclude
开头的所有内容
答案 0 :(得分:6)
稍微改变一下:
/^admin[a-z]+(?<!ex)$/gi
^
将你的前瞻转变为后视。
目前的形式很难解释。基本上,您需要到达字符串$
的末尾才能使正则表达式匹配,当它发生时,(?!ex)
位于字符串的末尾,因此它无法看到前方的任何内容。但是,由于我们位于字符串的末尾,我们可以使用后视(?<!ex)
来检查字符串是否以ex
结尾。
由于环视为零宽度,我们可以在不改变含义的情况下交换(?<!ex)
和$
的位置(但它会改变引擎搜索匹配字符串的方式):< / p>
/^admin[a-z]+$(?<!ex)/gi
以这种方式编写它是违反直觉的,但更容易看出我的论点在哪里。
另一种看待它的方法是:由于(?!ex)
和$
是零宽度断言的事实,它们在同一位置被检查,并且位于字符串的末尾{ {1}}意味着你不会发现任何事情。
答案 1 :(得分: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);