Regex 带分组的perl负回望
我有一个问题,试图让一个特定的匹配工作与消极落后 范例Regex 带分组的perl负回望,regex,perl,grouping,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 kind
@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
@list=qw(苹果香蕉樱桃);
$comb_tlist=join(“|”,@list);
$string1=“包括$(目录)/苹果”;
$string2=“#包括$(目录)/苹果”;
如果($string1=~/^(?)?
数组包含一组与字符串匹配的变量
我需要正则表达式匹配$string1,但不匹配$string2。
它与$string1匹配,但也与$string2匹配。有人能告诉我我这里的错误是什么吗?谢谢!您不需要反向查找,只需匹配不是
的第一个字符即可:
此外,如果要匹配一个文本$(dir)
,则需要用反斜杠转义$
符号,否则它表示标量变量。如果是这种情况,“$(dir)”
应该是\$(dir)
在Perl代码中。您不需要反向查找,只需匹配不是
的第一个字符:
此外,如果要匹配一个文本$(dir)
,则需要用反斜杠转义$
符号,否则它表示标量变量。如果是这种情况,则在Perl代码中,“$(dir)
应该是\$(dir)
。一些问题:
- 始终使用
使用严格;使用警告;
- 修正
string1
的用法,即$string1
- 在适当的情况下,使用
my
,修复上面检测到的范围界定错误
- 修正变量名(
@list
vs@tlist
)中的输入错误
- 我确信您不是有意插入
$(
变量)
- 您永远不会在字符串的第一个字符之前找到
#
,因此/^(?没有意义。它只是表示/^.*.*./
。您可能想要/^[^.].*/
一些问题:
- 始终使用
使用严格;使用警告;
- 修正
string1
的用法,即$string1
- 在适当的情况下,使用
my
,修复上面检测到的范围界定错误
- 修正变量名(
@list
vs@tlist
)中的输入错误
- 我确信您不是有意插入
$(
变量)
- 您永远不会在字符串的第一个字符之前找到
#
,因此/^(?没有意义。它只是表示/^.*.*./
。您可能想要/^[^.].*/
如果将复杂的正则表达式拆分为两个或三个,它们有时会变得微不足道。
Filterout在第一步中注释了字符串。有时复杂的正则表达式变得微不足道,如果您只是将它们分成两个或三个。
Filterout注释字符串在第一步中。问题是,反向查找和行首都是零宽度匹配
“从字符串的开头开始”
然后说
“检查前面的字符是否为#”
…实际上是在字符串开头之前检查字符。这当然不是
,因为它什么都不是
改为使用前瞻。这可以:
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"; }
请注意,您在示例代码中犯了四个严重错误。首先,您使用了string1
,这是一个裸字,将被解释为字符串。其次,您声明了@list
,但随后使用了@tlist
。第三,您(似乎)没有使用
这些pragma可能已经通知了您的错误,如果没有它们,您很可能不会收到关于前两个关键错误的警告。没有充分的理由不使用它们,所以以后要这样做
第四,宣言
$string1 = "include $(dir)/apple";
表示您试图在字符串中插入变量$(
。$
是双引号字符串中的元字符,因此应使用单引号:
my $string1 = 'include $(dir)/apple';
问题是,负回溯和行首都是零宽度匹配
“从字符串的开头开始”
然后说
“检查前面的字符是否为#”
…实际上是在字符串开头之前检查字符。这当然不是
,因为它什么都不是
改为使用前瞻。这可以:
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"; }
请注意,您在示例代码中犯了四个严重错误。首先,您使用了string1
,这是一个裸字,将被解释为字符串。其次,您声明了@list
,但随后使用了@tlist
。第三,您(似乎)没有使用
这些pragma可能已经通知了您的错误,如果没有它们,您很可能不会收到关于前两个关键错误的警告。没有充分的理由不使用它们,所以以后要这样做
第四,宣言
$string1 = "include $(dir)/apple";
表示您试图在字符串中插入变量$(
。$
是双引号字符串中的元字符,因此应使用单引号:
my $string1 = 'include $(dir)/apple';
是不是因为打字错误,你把美元符号忘在了if前面(string1…
?您使用的是@list
和@tlist
?是的,谢谢您指出。我的示例是一种伪代码,我只是想知道我需要什么正则表达式来满足我的要求。是不是输入错误,您忘记了前面的美元符号(string1…
?您使用的是@list
和@tlist
?是的,谢谢您指出。我的示例是一种伪代码,我只是想知道我需要什么正则表达式来满足我的要求。您对$(
?@ysth)有什么不满吗?没什么。OP可能打算使用“${dir}”
,但他使用了“$(dir)”
你对$有什么不满(
?@ysth,没什么。OP可能是想使用“${dir}”
,但他使用了