2014-02-10 44 views
1

在下面:如何驗證正則表達式匹配的內容?

~$ perl -e ' 
my $var = "March 1998"; 
$var =~ /([0-9]*)/; 
print "$1\n"; 

沒有被打印。我不明白爲什麼,但想着這一點後,我認爲它,因爲它需要0或多次出現了一些和整條生產線滿足,只是不數部相匹配。但我怎麼能真正看到/「捕獲」它真正匹配,以驗證我的假設>

+0

如何使用'$&'?但是如果你想檢查它是否至少匹配1個數字,你需要使用'+'而不是'*'。 – AntonH

+3

我想你想'[0-9] +'這是比較常用寫作'\ d +'。 – squiguy

+0

有時間的人可以更好地解釋這個問題,但問題在於'*'。它意味着「零次或多次」,而且很貪婪。因此,它會將這些數字中的一個與零時間匹配,並將其稱爲一天。匹配的結果是「真實的」...但捕獲是空的(零次)。 '+'是「一個或多個」,所以你可以在捕捉中獲得'1998'。 –

回答

4

$1包含哪些被捕獲,所以你這樣做的權利。

特殊變量$',$&$`也會有幫助。有關更多信息,請參閱perlvar

$match = $var =~ /([0-9]*)/; 

print "There ", ($match ? "was" : "was not"), " a match\n"; 
print "The captured expression was '$1'\n"; 
print "The matched expression was '$&'\n"; # includes chars outside capture groups 
print "Expression before the match was '$`'\n"; 
print "Expression after the match was '$''\n"; 

用Perl 5.10起,您還可以使用/p修改和更具可讀性${^PREMATCH}${^MATCH}${^POSTMATCH}變量。

$match = $var =~ /([0-9]*)/p; 

print "There ", ($match ? "was" : "was not"), " a match\n"; 
print "The captured expression was '$1'\n"; 
print "The matched expression was '${^MATCH}'\n"; 
print "Expression before the match was '${^PREMATCH}'\n"; 
print "Expression after the match was '${^POSTMATCH}'\n"; 
4

正如已經提到的,從來沒有檢查$1$2等不檢查匹配成功。否則,這些變量將包含最近成功的正則表達式匹配後所包含的任何變量。一個例外是當正則表達式可以匹配任何字符串 - 因爲你可以,但你可能沒有意識到這一點 - 但那種情況並不多見,這是更好地得到進入總測試賽的成功習慣。

@-@+變量給出了匹配捕獲組的開始和結束索引(分別爲),該匹配捕獲組是上一次成功的正則表達式匹配的對象的字符串。

if ($var =~ /([0-9]*)/) { 
    print "The first capturing group matched from index $-[1] to index $+[1].\n"; 
} 

這將打印The first capturing group matched from index 0 to index 0.果然,你的字符串開頭的零位,所以這就是被匹配。