负面前瞻RegEx

时间:2016-11-08 17:44:11

标签: regex perl

为什么这不起作用?试图做一个负面的预测。我试图从垃圾箱中取出数字,除了隔离箱和检查箱。当我使用前面的^代码匹配括号中的所有数字。当我删除^它什么都不匹配。

还可以使用“或运算符|”在负面的向前看?我想要^(?!Quarantine_Bin | Inspection_Bin)

我还尝试专门否定[^Quarantine_Bin]并且仍然匹配。

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

数据

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

4 个答案:

答案 0 :(得分:5)

这是一个消极的 lookbehind

use warnings;
use feature 'say';

my @strings = (
    "Quarantine_Bin(5),Inspection_Bin(3),Regular_Bin(5),other(2)",
    "Quarantine(2),Other_Bin(2),Quarantine_Bin(2),Quarantine_Bin(2),"
);

for (@strings) {
    my @m = $_ =~ /(?<!\b(?:Quarantine|Inspection)_Bin)\(\d+\)/g; 
    say "@m";
} 

^锚点无法在此处执行操作,请使用\b指定字边界。

这包括带数字的括号,返回行(5) (2)(2) (2)

如果您想省略它们,请在数字周围添加捕捉画面

/(?<! \b(?: Quarantine|Inspection)_Bin ) \( (\d+) \)/xg;

或拉开lookbehind内的开口paren(因此它不被消耗)并省略结束的

/(?<! \b(?: Quarantine|Inspection)_Bin \( ) \d+/xg;

这些返回行5 22 2,没有parens。

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

答案 1 :(得分:4)

你应该使用负面的lookbehind:

(?<!\b(Quarantine|Inspection)_Bin)\([0-9]+\)

RegEx Demo

(?<!\b(Quarantine|Inspection)_Bin)是一种负面的背后隐喻,如果在我们的匹配之前有Quarantine_BinInspection_Bin则声明失败。 \b用于字边界。

答案 2 :(得分:2)

^(?!Quarantine_Bin)\([0-9]+\)检查字符串的开头是否后跟Quarantine_Bin,但后跟\([0-9]\)。这永远不会成真。

[^Quarantine_Bin]匹配的字符不是BQaei,{{1} },nrtu。不是你想要的。

没有过滤,你就有了

_

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

Inspection_Bin

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

前瞻中的\b(?!(?:Quarantine|Inspection)_Bin\b)\w+\([0-9]+\) 会阻止\b被过滤掉。

有用的:

Quarantine_Bin_X(?:(?!STRING).)*STRING[^CHAR]*

答案 3 :(得分:1)

它在评论中,所以我将其作为一个真正的答案充实。

我建议一般避免前瞻/后面的正则表达式,因为它可能变得复杂和混乱。在您的使用案例中 - 我可能只需将split行放入数组中,并逐个处理。

类似的东西:

#!/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)