Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带分组的perl负回望_Regex_Perl_Grouping - Fatal编程技术网

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}”
,但他使用了