2010-06-16 83 views
1

假设我有变量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的“ab”和x2的“ef”,因为一旦找到第一个匹配,引擎就已经读取了第二个“XX”。

感谢您的任何帮助。

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

回答

8

尝试

$stuff_between_xx = split /XX/, $x1; 
+0

美丽,谢谢! – itzy 2010-06-16 14:23:47

3

可以使用split

@stuff_between_xx = split /XX/, $x1; 

匹配数:使用positive lookahead

+0

谢谢,这将工作。如何以一种方式卡住思考,并没有看到明显的解决方案,这很有趣。但我很好奇,如果任何人有另一种解决方案,只会用正则表达式 - 主要是我可以学习。 – itzy 2010-06-16 14:13:58

+0

这指派给'$ stuff_between_xx'部分的**数字** – 2010-06-16 14:14:52

+0

@kemp:whops,已更正 – knittl 2010-06-16 14:27:02

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

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

我建议拆分以及knittl。但是,您可能要删除的空白,以及:

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

你也能使用向前看符号,但你真的不需要它们,因为你可以用相当复杂的交替,以及:

非-ws版本也只是:

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

的交替说,如果它没有再接再你如果不是一个'X'带走任何东西 - 但你会采取。将会有一个前瞻角色,但它可以积极消耗角色,而不会回溯。

修剪版本将不得不退回空格字符,所以表达更丑。

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