如何匹配重叠的perl正则表达式?

时间:2018-01-12 19:34:32

标签: regex perl

我正在尝试使用正则表达式匹配重叠部分时使用/ 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'。

2 个答案:

答案 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+

在前者中,相邻的数字绝不是匹配的一部分。

在后者中,只有前面的数字才是比赛的一部分。