2014-02-18 46 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