正则表达式忽略了第二个前瞻

时间:2017-12-08 19:05:48

标签: php regex

我无法理解为什么第二个输出会忽略(?!B)条件并返回201B而不是20 x 1B

我的PHP代码:

$s_1 = '20 x 1';
$s_2 = '20 x 1B';

$pattern = '/(?<=\d)[\s]*[xX][\s]*(?=\d)(?!B)/ui';

echo preg_replace($pattern, '', $s_1); // output: 201
echo preg_replace($pattern, '', $s_2); // output: 201B

1 个答案:

答案 0 :(得分:2)

您的上一个否定前瞻应该嵌套在(?=\d)

(?<=\d)\s*[xX]\s*(?=\d(?!B))

RegEx Demo

(?!B)在你的正则表达式之外时,然后在匹配x和空格后应用零宽度断言。该断言返回true,因为下一个位置是一个数字。