2010-06-16 76 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;