如果模式前面有字符串,请避免正则表达式匹配



我有这些字符串,我想匹配b=(d+)而不是ab=(d+)。我该怎么做?

"ab=10&b=20" -> 20
"b=20&ab=10" -> 20
"b=20" -> 20
"ab=10" -> no match
您可以使用

b,例如:

bb=(d+)

仅在单词边界(ww之间)匹配。

使用负面的回溯:

/(?<!a)b=(d+)/

现在,这将匹配任何数字,后跟b=如果前面没有字符a

测试用例:

$array = array(
    "ab=10&b=20",
    "b=20&ab=10",
    "b=20",
    "ab=10"
);
foreach ($array as $str) {
    if (preg_match('/(?<!a)b=(d+)/', $str, $matches)) {
        echo $matches[1], PHP_EOL;
    } else {
        echo "No match", PHP_EOL;
    }
}

输出:

20
20
20
No match

演示

这是我

得到的:

(?:[^a-zA-Z])(?:b=(d+))

(?:[^a-zA-Z]) 它不能以 a-z 开头。你可能想改变这一点,但你明白了 (?:b=(d+))我把它包装成一个组以使正则表达式组合它,?:确保\1仍然20

最新更新