Perl正则表达式问题

时间:2010-06-16 14:02:29

标签: regex perl

假设我有变量

$x1 = 'XX a b XX c d XX';
$x2 = 'XX a b XX c d XX e f XX';

我想要一个正则表达式,它将找到XX之间的每个字母实例。我正在寻找一个通用的解决方案,因为我不知道有多少XX。

我尝试使用/XX(.*?)XX/g,但这只匹配x1的“ab”和x2的“ab”,“ef”,因为一旦找到第一个匹配项,引擎已经读取了第二个匹配项“XX”。

感谢您的帮助。

4 个答案:

答案 0 :(得分:8)

尝试使用positive lookahead

/XX(.*?)(?=XX)/

答案 1 :(得分:3)

您可以使用split

@stuff_between_xx = split /XX/, $x1;

匹配数量:

$stuff_between_xx = split /XX/, $x1;

答案 2 :(得分:3)

我建议拆分以及knittl。但您可能也想删除空格:

my @stuff = split /\s*XX\s*/, $line;

此外可以使用前瞻,但你真的不需要它们,因为你也可以使用相当复杂的替换:

非ws版本只是:

my @stuff = $line =~ m/XX((?:[^X]|X[^X])*)/g; 

替换说,如果不是'X',你会采取任何措施 - 但如果没有其他'X',则会'X'。将会有一个前瞻性角色,但它可以积极地消耗角色,而不会回溯。

修剪版本必须回溯以删除空格字符,因此表达式更加丑陋。

my @stuff = $line =~ m/XX\s*((?:[^X]|X[^X])*?(?:[^X\s]|X[^X]))/g;

答案 3 :(得分:0)

my $x2 = 'XX a b XX c d XX e f XX';

my @parts = grep { $_ ne '' } split /\s*XX\s*/, $x2;