我无法理解为什么第二个输出会忽略(?!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
答案 0 :(得分:2)
您的上一个否定前瞻应该嵌套在(?=\d)
:
(?<=\d)\s*[xX]\s*(?=\d(?!B))
当(?!B)
在你的正则表达式之外时,然后在匹配x
和空格后应用零宽度断言。该断言返回true,因为下一个位置是一个数字。