我有这些字符串,并且我想匹配b=(\d+)
而不是ab=(\d+)
。我该怎么做?避免正则表达式匹配,如果模式之前有字符串
"ab=10&b=20" -> 20
"b=20&ab=10" -> 20
"b=20" -> 20
"ab=10" -> no match
我有这些字符串,并且我想匹配b=(\d+)
而不是ab=(\d+)
。我该怎么做?避免正则表达式匹配,如果模式之前有字符串
"ab=10&b=20" -> 20
"b=20&ab=10" -> 20
"b=20" -> 20
"ab=10" -> no match
你可以使用\b
,如:
\bb=(\d+)
其中仅在单词边界(\w
而不是\w
之间)相匹配。
这是我得到:
(?:[^a-zA-Z])(?:b=(\d+))
(?:[^a-zA-Z])
它不能以-Z开始。你可能想改变这一点,但你的想法 (?:b=(\d+))
我把它包在一组,使正则表达式结合起来,?:
确保\\1
仍将20
不适用于第二和第三种情况。 – Toto
/(?<!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
完美!谢谢。真的很感谢所有其他答案的家伙!让他们继续来。 – Prasanth
Word Boundries,没有想到这一点,聪明。 – Martijn
我意识到vim中的单词边界。 Vim很聪明! :) – Prasanth