字符串中间的正则表达式负匹配

时间:2015-01-08 07:28:21

标签: php regex negative-lookbehind

我有这些字符串(分别检查每一行):

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx

现在我希望匹配以admin开头但不以Ex结尾的任何内容(不区分大小写)

因此在应用正则表达式之后我必须匹配:

adminUpdate
adminEditXe
adminExclude

My current regex is /^admin[a-z]+(?!ex)$/gi但它匹配以admin

开头的所有内容

2 个答案:

答案 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);