use*_*348 1 regex perl grouping
我有一个问题,试图让某个匹配与负面看后面一起工作
例
@list = qw( apple banana cherry);
$comb_tlist = join ("|", @list);
$string1 = "include $(dir)/apple";
$string2 = "#include $(dir)/apple";
if( $string1 =~ /^(?<!#).*($comb_tlist)/) #matching regex I tried, works kinda
Run Code Online (Sandbox Code Playgroud)
该数组包含一组与字符串匹配的变量.
我需要正则表达式匹配$ string1,但不是$ string2.它匹配$ string1,但它也匹配$ string2.任何人都可以告诉我这里我错了什么.谢谢!
问题是负面的后观和线的起点^都是零宽度匹配.所以当你说
"从字符串的开头开始"
然后说
"检查前面的角色是不是#"
...你实际上在字符串开始之前检查字符.这当然不是#,因为它什么都没有.
请改用前瞻.这有效:
use strict;
use warnings;
my @list = qw( apple banana cherry);
my $comb_tlist = join ("|", @list);
my $string1 = 'include $(dir)/apple';
my $string2 = '#include $(dir)/apple';
if( $string1 =~ /^(?!#).*($comb_tlist)/) { say "String1"; }
if( $string2 =~ /^(?!#).*($comb_tlist)/) { say "String2"; }
Run Code Online (Sandbox Code Playgroud)
请注意,您在示例代码中犯了四个严重错误.首先,你使用的string1是一个裸字,它将被解释为一个字符串.其次,你申报@list但随后使用@tlist.第三,你没有(似乎)使用
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
这些pragma可以告诉你你的错误,如果没有它们,你很可能不会被告知你的前两个关键错误.没有充分的理由不使用它们,所以将来也这样做.
四,声明
$string1 = "include $(dir)/apple";
Run Code Online (Sandbox Code Playgroud)
意味着您尝试$(在字符串中插入变量.$是双引号字符串中的元字符,因此您应该使用单引号:
my $string1 = 'include $(dir)/apple';
Run Code Online (Sandbox Code Playgroud)