字符串中间的正则表达式否定匹配
Regex negative match in middle of string
我有这些字符串(分别检查每一行):
adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
现在我想匹配任何以 admin
开头但不以 Ex
结尾的内容(不区分大小写)
所以在应用正则表达式后我必须匹配:
adminUpdate
adminEditXe
adminExclude
My current regex is /^admin[a-z]+(?!ex)$/gi
但它匹配任何以 admin
开头的内容
稍作改动:
/^admin[a-z]+(?<!ex)$/gi
^
把你的前瞻变成回顾。
以目前的形式很难解释。基本上,您需要到达字符串的末尾 $
才能匹配正则表达式,当它发生时,(?!ex)
位于字符串的末尾,因此它看不到前面的任何内容。然而,由于我们在字符串的末尾,我们可以使用后视 (?<!ex)
来检查字符串是否以 ex
结尾。
因为 look-around 是零宽度的,我们可以交换 (?<!ex)
和 $
的位置而不改变意思(虽然它确实改变了引擎搜索匹配字符串的方式) :
/^admin[a-z]+$(?<!ex)/gi
这样写是违反直觉的,但更容易看出我的论点在哪里。
另一种看法是:由于(?!ex)
和$
是零宽度断言,所以在同一个位置检查,并且在最后string $
意味着你不会看到任何东西。
^(?!.*Ex$)admin.*$
尝试 this.See 演示。
https://regex101.com/r/sH8aR8/23
$re = ""^(?!.*Ex$)admin.*$"m";
$str = "adminUpdate\nadminDeleteEx\nadminEditXe\nadminExclude\nlistWebsite\nlistEx";
preg_match_all($re, $str, $matches);
我有这些字符串(分别检查每一行):
adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
现在我想匹配任何以 admin
开头但不以 Ex
结尾的内容(不区分大小写)
所以在应用正则表达式后我必须匹配:
adminUpdate
adminEditXe
adminExclude
My current regex is /^admin[a-z]+(?!ex)$/gi
但它匹配任何以 admin
稍作改动:
/^admin[a-z]+(?<!ex)$/gi
^
把你的前瞻变成回顾。
以目前的形式很难解释。基本上,您需要到达字符串的末尾 $
才能匹配正则表达式,当它发生时,(?!ex)
位于字符串的末尾,因此它看不到前面的任何内容。然而,由于我们在字符串的末尾,我们可以使用后视 (?<!ex)
来检查字符串是否以 ex
结尾。
因为 look-around 是零宽度的,我们可以交换 (?<!ex)
和 $
的位置而不改变意思(虽然它确实改变了引擎搜索匹配字符串的方式) :
/^admin[a-z]+$(?<!ex)/gi
这样写是违反直觉的,但更容易看出我的论点在哪里。
另一种看法是:由于(?!ex)
和$
是零宽度断言,所以在同一个位置检查,并且在最后string $
意味着你不会看到任何东西。
^(?!.*Ex$)admin.*$
尝试 this.See 演示。
https://regex101.com/r/sH8aR8/23
$re = ""^(?!.*Ex$)admin.*$"m";
$str = "adminUpdate\nadminDeleteEx\nadminEditXe\nadminExclude\nlistWebsite\nlistEx";
preg_match_all($re, $str, $matches);