Regex Perl条件正则表达式提取
此条件必须与Regex Perl条件正则表达式提取,regex,perl,Regex,Perl,此条件必须与telco\u imac\u city或telco\u hier\u city匹配。当它成功时,我需要提取匹配值的第二个下划线 我可以用这个代码工作 if ( ($value =~ /(telco_imac_)city/) || ($value =~ /(telco_hier_)city/) ) { print "value is: \"$1\"\n"; } 但如果可能的话,我宁愿使用这样一个正则表达式 $value = $ARGV[0]; if ( $value =~ /
telco\u imac\u city
或telco\u hier\u city
匹配。当它成功时,我需要提取匹配值的第二个下划线
我可以用这个代码工作
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\u hier\u city
,我会在测试第二个值时得到这个输出
Use of uninitialized value $1 in concatenation (.) or string at ./test.pl line 19.
value is: ""
我做错了什么?while(){
while (<$input>){
chomp;
print "$1\n" if /(telco_hier|telco_imac)_city/;
}
咀嚼;
打印“$1\n”如果/(电信公司|电信公司| imac)城市/;
}
根据单个语句中的匹配项进行编号。您的输入,telco\u hier\u city
,与单个正则表达式的第二次捕获匹配(/(telco\u imac\u)city |(telco\u hier\u)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_"
$> ./conditionalIfRegex.pl telco_hier_city
value is: "telco_hier_"
$> ./conditionalIfRegex.pl telco_imac_city
value is: "telco_imac_"
由于您的第一个捕获组((telco\u imac)
)中没有匹配项,$1
未按预期初始化
要修复原始代码,请使用:
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_hier_city
value is: "telco_hier_"
$> ./conditionalIfRegex.pl telco_imac_city
value is: "telco_imac_"
OP想返回“匹配值的第二个下划线”(即,
telco\u hier\u
或telco\u imac\u
)。如果$value
是telco\u imac\u
,会发生什么情况?@FlyingFrog用您的正则表达式(稍微修改的版本)编辑,谢谢!答案的原始部分有助于OP理解未初始化警告发生的原因。