我正在尝试使用正则表达式匹配重叠部分时使用/ g。我相信我需要使用lookbehind,但我无法理解文档并使其匹配。
例如,测试用例:
use feature ':5.18';
use warnings;
use diagnostics;
use utf8;
my $test = '1 1 1';
$test =~ s/(?=[0-9]+) ([0-9]+)/$1$2/g;
say $test; # still get '1 1 1'
如何摆脱空间?输出应该是'111'。
答案 0 :(得分:5)
为了能够删除数字之间的空格,您可以使用zero-width look-arounds assertions:
$test =~ s/(?<=[0-9])\s+(?=[0-9])//g;
<强>解体:强>
(?<=[0-9])
:断言我们在前一个位置有一个数字\s+
:匹配1 +空格(?=[0-9])
:断言我们在下一个位置有一个数字答案 1 :(得分:3)
当两个相邻的数字都是匹配的一部分时会遇到问题。
$test =~ s/([0-9])\s+([0-9])/$1$2/g; # XXX Bad
解决方案:
$test =~ s/(?<=[0-9])\s+(?=[0-9])//g;
或效率更高
$test =~ s/[0-9]\K\s+(?=[0-9])//g; # 5.10+
在前者中,相邻的数字绝不是匹配的一部分。
在后者中,只有前面的数字才是比赛的一部分。