2017-12-08 8 views
2

2番目の出力が(?!B)の条件を無視し、20 x 1Bの代わりに201Bを返す理由を理解できませんか?Regexは2番目の先読みを無視します

私の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

これはPHPのコンテキストでですか?それに応じてタグ付けする必要があります。正規表現は実装ごとに根本​​的に異なる場合があります。 – tadman

+0

期待される出力は何ですか? "無視する"(?!B) '"とはどういう意味ですか? –

+0

はい、PHPです。期待される出力は '20 x 1B'です – user451555

答えて

2

あなたの最後の否定先読みが(?=\d)内にネストする必要があります。

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

RegEx Demo

(?!B)はあなたの正規表現のように外にある場合には、その後、その後ゼロ幅アサーションは、xと一致すると適用されます。ペース。次の位置が数字なので、そのアサーションはtrueを返します。

関連する問題