2013-08-30 50 views
-1

我有一個變量,就像$ var = 1.2.3或$ var = Variable/1.2.3。我正在嘗試編寫一個匹配並存儲在$ 1中的正則表達式。代碼如下:Perl正則表達式OR條件

if ($var =~ m/[\w+\/\d+.\d+.\d+])/){ 
    $a = $1; 
} 

我想匹配上述條件,如果任何$ var盛行。請建議我。謝謝。

+1

我不明白的問題。也許你可以添加一些輸入和期望匹配的例子。 – theglauber

+0

如果你想匹配一個文字'.',那麼你需要在你的正則表達式中使用反斜槓 - 轉義它。 'm /./''而不是'm /./' – ThisSuitIsBlackNot

+0

或者daxim在他的回答中做了這樣的處理,把這個點放在括號裏:'m /[.]/' – ThisSuitIsBlackNot

回答

1

您應該刪除該字符類。一個字符類只匹配一個字符。它不代表任何順序。此外,.是正則表達式中的元字符。要從字面上匹配它,你需要逃避它。

然後,你需要/爲可選之前,在部分,採用?量詞,因爲它不一定出現在字符串:

if ($var =~ m/((?:\w+\/)?\d+\.\d+\.\d+)/){ 
    $a = $1; 
} 

僅供參考,你可以使用任何分隔符匹配運算符,以免逃逸/

m!((?:\w+/)?\d+\.\d+\.\d+)! 
+0

這工作正常..謝謝@Rohit Jain – deep

2

Parentheses capture。它很容易出錯依賴於$1,只需使用來自m atch運算符的返回值。

for my $var ('1.2.3', 'Variable/1.2.3') { 
    if (my ($version) = $var =~ m{ 
     (?:\A | /)   # beginning of string or a slash 
     (\d+ [.] \d+ [.] \d+) # capture version number triple 
     \z     # end of string 
    }msx) { 
     print ">>> $version <<<\n"; 
    } 
} 
__END__ 
>>> 1.2.3 <<< 
>>> 1.2.3 <<< 
+1

或'm {(?:^ | /)(\ d + [。] \ d + [。] \ d +)$} x '如果它應該被錨定(例如,如果需要驗證)。 – ikegami

+0

好主意,加入答案 – daxim

+0

@daxim:我從數組中獲取上述變量。因此,上面的for循環會造成混淆。你怎麼看?? – deep

-1

試試這個:

if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) { 
    $a = $&; 
}