2014-02-18 45 views
2

該條件必須匹配telco_imac_citytelco_hier_city。當它成功時,我需要提取到匹配值的第二個下劃線。Perl條件正則表達式提取

我可以把它與這個代碼

if (($value =~ /(telco_imac_)city/) || ($value =~ /(telco_hier_)city/)) { 
    print "value is: \"$1\"\n"; 
} 

工作,但如果可能的話,我寧願使用一個單一的正則表達式這樣

$value = $ARGV[0]; 
if ($value =~ /(telco_imac_)city|(telco_hier_)city/) { 
    print "value is: \"$1\"\n"; 
} 

但是如果我通過了價值telco_hier_city我在得到這個輸出測試第二個值

我在做什麼錯?

回答

1
while (<$input>){ 
    chomp; 
    print "$1\n" if /(telco_hier|telco_imac)_city/; 
} 
+0

OP想要回 「最多隻能說是匹配值的第二個下劃線」(即,'telco_hier_'或'telco_imac_')。 – admdrew

1

Perl capture groups根據單個語句中的匹配進行編號。您的輸入,telco_hier_city,匹配捕獲該單個正則表達式(/(telco_imac_)city|(telco_hier_)city/),這意味着你需要使用$2

my $value = $ARGV[0]; 
if ($value =~ /(telco_imac_)city|(telco_hier_)city/) { 
    print "value is: \"$2\"\n"; 
} 

輸出:

$> ./conditionalIfRegex.pl telco_hier_city 
value is: "telco_hier_" 

因爲沒有在比賽如預期的那樣,您的第一個捕獲組((telco_imac_)),$1未初始化。

要解決你的原代碼,使用FlyingFrog's regex

my $value = $ARGV[0]; 
if ($value =~ /(telco_hier_|telco_imac_)city/) { 
    print "value is: \"$1\"\n"; 
} 

輸出:

$> ./conditionalIfRegex.pl telco_hier_city 
value is: "telco_hier_" 

$> ./conditionalIfRegex.pl telco_imac_city 
value is: "telco_imac_" 
+0

當'$ value'是'telco_imac_'時會發生什麼? – fugu

+0

@FlyingFrog用你的正則表達式(稍微修改一下)編輯,謝謝!答案的原始部分有助於OP瞭解未初始化警告發生的原因。 – admdrew