如何在正则表达式中结合正面和负面条件?

时间:2009-08-20 20:47:21

标签: regex perl regex-negation lookahead negative-lookahead

我对正则表达式相当新,需要一些帮助。我需要在Perl中使用正则表达式过滤一些行。我将把正则表达式传递给另一个函数,因此需要在一行中完成。

我只想选择包含"too long"并且不以"SKIPPING"

开头的行

以下是我的测试字符串:

  

从成熟到太长时间来跳过此债券   TKIPPING这个债券,因为到期时间太长了   因为成熟期过长而使这种债券减少了   你好,这个成熟期太长了   这太长了   你好吗

正则表达式规则应该与“太长时间”匹配以下内容:

  

从成熟到太长时间来跳过此债券   因为成熟期过长而使这种债券减少了   你好,这个成熟期太长了   这太长了

它应该跳过:

  

“你好,因为它不包含'太长'。”   “从成熟到太长时间来推销这种债券”,因为它包含'跳过'

6 个答案:

答案 0 :(得分:11)

/^(?!SKIPPING).*too long/

答案 1 :(得分:10)

就我个人而言,我只是为了让它更清晰而将其作为两个单独的正则表达式。

while (<FILE>)
{
  next if /^SKIPPING/;
  next if !/too long/;

   ... do stuff
}

答案 2 :(得分:3)

我怀疑你可能在一个正则表达式之后但我更喜欢分成更可读的东西:

use strict;
use warnings;

for my $line ( <DATA> ) {
    next  if $line =~ m/^SKIPPING/;
    next  if $line !~ m/too long/;

    # do something with $line
    chomp $line;
    say "Found: ", $line, ':length=', length( $line );
}

__DATA__
SKIPPING this bond since maturity too long
TKIPPING this bond since maturity too long
SLAPPING this bond since maturity too long
Hello this maturity too long
this is too long
hello there

答案 3 :(得分:1)

使用前瞻;见this explanation of regex lookaround

^(?!SKIPPING).*too long

答案 4 :(得分:-1)

/^(?<!SKIPPING).*too long$/

匹配您正在寻找的线条。最后的美元符号使它只匹配以“太长”结尾的字符串。

希望这有帮助!

答案 5 :(得分:-2)

使用负面观察:

(?<!^SKIPPING)too long$