为什么这不起作用?试图做一个负面的预测。我试图从垃圾箱中取出数字,除了隔离箱和检查箱。当我使用前面的^代码匹配括号中的所有数字。当我删除^它什么都不匹配。
还可以使用“或运算符|”在负面的向前看?我想要^(?!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)
答案 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 2
和2 2
,没有parens。
/x
修饰符允许内部空格以便于阅读。
答案 1 :(得分:4)
你应该使用负面的lookbehind:
(?<!\b(Quarantine|Inspection)_Bin)\([0-9]+\)
(?<!\b(Quarantine|Inspection)_Bin)
是一种负面的背后隐喻,如果在我们的匹配之前有Quarantine_Bin
或Inspection_Bin
则声明失败。
\b
用于字边界。
答案 2 :(得分:2)
^(?!Quarantine_Bin)\([0-9]+\)
检查字符串的开头是否后跟Quarantine_Bin
,但后跟\([0-9]\)
。这永远不会成真。
[^Quarantine_Bin]
匹配的字符不是B
,Q
,a
,e
,i
,{{1} },n
,r
,t
或u
。不是你想要的。
没有过滤,你就有了
_
您希望确保\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)