2014-05-05 22 views
1

如果regex是一個正則表達式,我可以捕獲它的兩個重複這樣的:如何在Perl中捕獲所有量化的正則表達式匹配?

if (/(regex)(regex)/) { 
    print $1; 
    print $2; 
} 

但是,這是不好的Perl,因爲應該使用{2}量詞,和壞的通用編程風格,因爲它重複的代碼。所以我想這樣做:

if (/(regex){2}/) { 
    print $1; 
    print $2; 
} 

但這不起作用,只有第一個匹配打印。

有沒有辦法打印兩個匹配,而不是重複代碼?

+0

我想你可能會把你的問題抽象得離實際問題太遠而讓人困惑。如果這是真正的問題,我只會寫'print $ 1 if /(regexregex)/'。那你爲什麼不能那樣做? – Borodin

+0

因爲正則表達式很長,我不想重複它 - 每個代碼應該在一個地方,代碼重複是不好的 –

+1

然後,你需要使用正則表達式變量,如'我的$ re = qr/regex/x 2 '然後'if if(/ $ re /){...}' – Borodin

回答

1

你究竟想達到什麼目的?您可以打印被匹配整體的一部分:

if (/((regex){2})/) { 
    print $1; 
} 

,或者你可以嘗試用while/g匹配幾次。 \G將確保在比賽之間沒有字符。

while (/\G(regex)/g) { 
    print $1; 
} 
-2

你可以串聯多個正則表達式一起這樣,如果你不在乎哪一個匹配:

if ($s =~ m!(regexp1|regexp2|regexp3)!){ 
    print "found $1\n"; 
} 

如果你在乎哪一個比賽,我會做這樣的:

foreach my $r ('regexp1','regexp2'){ 
    if ($s =~ m!$r!){ 
     print "$r matched: found $1 in $s\n"; 
    } 
} 
+1

我不確定你寫的是怎樣與原始問題相關的。你似乎完全回答了一個不同的問題 – Borodin

3

您需要在整個整個表達式中加上括號,包括量詞,如/((regex){2})/。但是,由於不需要內捕捉最好是使用非捕獲括號(?: ...)使你的代碼看起來像

if (/((?:regex){2})/) { 
    print $1; 
} 
1

我想正則表達式中多次Perl和打印匹配所有匹配

這不是你的程序在做什麼。你的程序正在做什麼,無論regex是什麼,它必須連續兩次。該{..}用於指定多少次,你想要的東西:

if ($string =~ /a{2,3}/) { 
    say "The string '$string' has two or three 'a' in a row"; 
} 

但是,你表裏如一要問的是讓所有的時間$regex發生在一個字符串。您可以保存比賽在這樣的數組:

my $string = "barfaafeebarbarfiifoo"; 
my @matches = ($string =~ /f../g); 
for my $match (@matches) { 
    say "$match"; 
} 

這將打印出:

faa 
fee 
fii 
foo 

如果有正則表達式/f../沒有匹配,那麼什麼都不會打印出來。我可以通過查看@matches的標量值並查看它是否大於零來測試比賽是否發生。

請注意,在這種情況下,我需要g在我的正則表達式的結尾。

相關問題