Regex 负前瞻正则表达式

Regex 负前瞻正则表达式,regex,perl,Regex,Perl,为什么这不起作用?试图做一个消极的前瞻。我正试图从垃圾箱中提取号码,除了检疫箱和检验箱。当我执行此操作时,前面带有“^”的代码与括号中的所有数字匹配。当我删除^I时,它与任何内容都不匹配 还可以在负前瞻中使用or运算符|?我想要^?!检疫箱|检验箱 我还试图明确否定[^quantial\u Bin],但它仍然匹配 ^(?!Quarantine_Bin)\([0-9]+\) 资料 您应该使用负回溯,如下所示: (?<!\b(Quarantine|Inspection)_Bin)\([0-9

为什么这不起作用?试图做一个消极的前瞻。我正试图从垃圾箱中提取号码,除了检疫箱和检验箱。当我执行此操作时,前面带有“^”的代码与括号中的所有数字匹配。当我删除^I时,它与任何内容都不匹配

还可以在负前瞻中使用or运算符|?我想要^?!检疫箱|检验箱

我还试图明确否定[^quantial\u Bin],但它仍然匹配

^(?!Quarantine_Bin)\([0-9]+\)
资料


您应该使用负回溯,如下所示:

(?<!\b(Quarantine|Inspection)_Bin)\([0-9]+\)
??是一种消极的后视,如果在比赛前有检疫箱或检验箱,则表明失败。 \b代表单词边界。

它是一个否定的后向查找

或者将开始部分拉入后视镜,使其不被消耗,并将结束部分略去

/(?<! \b(?: Quarantine|Inspection)_Bin \( ) \d+/xg;
这些返回线5 2和2 2,没有排列

/x修饰符允许内部有空格以便于阅读。

^?!隔离\u-Bin\[0-9]+\检查字符串的开头是否后跟隔离\u-Bin,而后跟\[0-9]\。这永远不可能是真的

[^quantial\u Bin]匹配的单个字符不是B、Q、a、e、i、n、r、t、u或。不是你想要的

如果没有过滤,你会

\b\w+\([0-9]+\)
您希望确保\b后面没有检疫箱或检验箱,因此可以使用

\b(?!Quarantine_Bin\b)(?!Inspection_Bin\b)\w+\([0-9]+\)

前瞻中的\b阻止隔离\u Bin\u X被过滤掉

有用的:


?:?!STRING.*是字符串,正如[^CHAR]*是字符。

它在注释中,因此我将充实它作为实际答案

我建议一般避免使用前向/后向正则表达式,因为它会变得复杂和混乱。在您的用例中,我可能只是将该行拆分为一个数组,并分别处理每个数组

比如:

#!/usr/bin/env perl
use strict;
use warnings;

while ( <DATA> ) { 
    chomp;
    #split on comma;
    #grep out Inspection_Bin and Quarantine_Bin
    my @fields = grep { not m/(?:Quarantine|Inspection)_Bin/ } split /,/;
    #iterate each field, and select out two different regex matches, e.g.
    #word bit and number bit. 
    print m/^(\w+)/, "=>", m/\((\d+)\)/, "\n" for @fields;
}


__DATA__
Quarantine(2),Other_Bin(2),Quarantine_Bin(2),Quarantine_Bin(2),Quarantine_Bin(5),Inspection_Bin(3),Regular_Bin(5),other(2)

因此,只有2和5应该从上面的字符串中提取?但老实说,我建议不要像这样使用正则表达式,而是拆分/、/并将值作为单独的测试进行匹配。复杂的正则表达式不适合程序维护。@Sobrique每行可以有不同数量的箱子,所以您认为拆分是最好的方法吗?
\b\w+\([0-9]+\)
\b(?!Quarantine_Bin\b)(?!Inspection_Bin\b)\w+\([0-9]+\)
\b(?!(?:Quarantine|Inspection)_Bin\b)\w+\([0-9]+\)
#!/usr/bin/env perl
use strict;
use warnings;

while ( <DATA> ) { 
    chomp;
    #split on comma;
    #grep out Inspection_Bin and Quarantine_Bin
    my @fields = grep { not m/(?:Quarantine|Inspection)_Bin/ } split /,/;
    #iterate each field, and select out two different regex matches, e.g.
    #word bit and number bit. 
    print m/^(\w+)/, "=>", m/\((\d+)\)/, "\n" for @fields;
}


__DATA__
Quarantine(2),Other_Bin(2),Quarantine_Bin(2),Quarantine_Bin(2),Quarantine_Bin(5),Inspection_Bin(3),Regular_Bin(5),other(2)