如果pattern之前有字符串,请避免使用正则表达式匹配

时间:2014-02-13 11:55:50

标签: php regex

我有这些字符串,我希望仅匹配b=(\d+) ab=(\d+)。我该怎么做?

"ab=10&b=20" -> 20
"b=20&ab=10" -> 20
"b=20" -> 20
"ab=10" -> no match

3 个答案:

答案 0 :(得分:5)

您可以使用\b,例如:

\bb=(\d+)

仅匹配单词边界(\w\w之间)。

答案 1 :(得分:1)

使用negative lookbehind

/(?<!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

Demo

答案 2 :(得分:0)

这就是我得到的:

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

(?:[^a-zA-Z])它不能以a-Z开头。你可能想要改变这个,但你明白了 (?:b=(\d+))我将其整理成一组以使正则表达式合并,?:确保\\1仍为20