2

编辑:对不起!我应该在之前提到这一点。在您的回答中,请不要假设下面列出的项目是我正在搜索的目录中的唯一内容。这些是我想要匹配的东西,除了指定的两个。谢谢。

这应该很容易,但我尝试的一切都没有成功。我有以下需要匹配的项目:

bodipr2__ds_di_uat
bodipr2__ds_dw_uat
bodipr2__ds_iq_uat
bodipr2__ds_iq_uat_back
bodipr2__ds_itsys_uat
bodipr2__ds_ppp_uat
bodipr2__ds_psd_uat
bodipr2__ds_usage_uat
bodits2__ds_pef_tst
bodits2__ds_ppp_tst
bodits2__ds_pri_tst

除了我想省略两个包含_iq_. 所以我写了一个这样的表达式:

bodi.*?__ds[^_iq_]

但这忽略了所有这些。如果我试试这个:

bodi.*?__ds_[^iq]

那省略了_itsys_一个。我猜它匹配不包含“i”或“q”的所有内容。我希望它省略该位置不包含'_iq_'的内容。

我很尴尬,我什至不得不问这个,但如果有人能指出我正确的方向,我会非常感激。

4

7 回答 7

4

试试这个:bod[a-z\d]+__ds_(?!iq_)\w+
我已经从http://regexr.com?31rho测试过

于 2012-08-15T16:36:05.060 回答
3

并且只是为了解释为什么您尝试的( [^iq])不起作用,这是因为[^iq]意思是“匹配任何一个字符,除非字符是“i”或“q”。[^_iq_]除了它也匹配“_”之外,意思相同。

所以,在你的情况下,

  • bodi.*?__ds[^_iq_]会匹配其中的 100%,因为每个单独的 sring 在“ds”之后都包含“_”,这将匹配[^_iq_]

  • bodi.*?__ds_[^iq]将仅匹配在“ds”之后包含字母“i”或“q”的行,这将是 - 正如您现在可以猜到的 -两个 _iq_AND_itsys_行。

匹配“不包含 iq”的正确方法是(?!iq)Godspeed 或 FailedDev 的答案中显示的否定前瞻。

于 2012-08-15T17:03:11.500 回答
1

如果有匹配项,您可以跳过处理其余部分:

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    next if /^bodipr2__ds_iq_/;  # Skip if bodipr2__ds_iq_ is matched

    # Process data
    print;
}

__DATA__
bodipr2__ds_di_uat
bodipr2__ds_dw_uat
bodipr2__ds_iq_uat
bodipr2__ds_iq_uat_back
bodipr2__ds_itsys_uat
bodipr2__ds_ppp_uat
bodipr2__ds_psd_uat
bodipr2__ds_usage_uat
bodits2__ds_pef_tst
bodits2__ds_ppp_tst
bodits2__ds_pri_tst

使用grep

#!/usr/bin/env perl

use strict;
use warnings;

my @strings = qw(
  bodipr2__ds_di_uat
  bodipr2__ds_dw_uat
  bodipr2__ds_iq_uat
  bodipr2__ds_iq_uat_back
  bodipr2__ds_itsys_uat
  bodipr2__ds_ppp_uat
  bodipr2__ds_psd_uat
  bodipr2__ds_usage_uat
  bodits2__ds_pef_tst
  bodits2__ds_ppp_tst
  bodits2__ds_pri_tst
);
@strings = grep /^bodipr2__ds_iq_/ ? 0 : 1, @strings;
于 2012-08-15T16:34:53.530 回答
0

您可以使用not反转:

if (not /^bodi.*_iq_.*/) {
  print;
}

或者:

if ($line !~ /^bodi.*_iq_.*/) {
   print;
}
于 2012-08-15T16:33:37.560 回答
0

这个怎么样:

    use strict;
    use warnings;



    for (<DATA>)
    {
        chomp;
        if (! m/bodi.*_iq_/)
        {
            print $_ . "\n";
        }
    }

__DATA__
bodipr2__ds_di_uat
bodipr2__ds_dw_uat
bodipr2__ds_iq_uat
bodipr2__ds_iq_uat_back
bodipr2__ds_itsys_uat
bodipr2__ds_ppp_uat
bodipr2__ds_psd_uat
bodipr2__ds_usage_uat
bodits2__ds_pef_tst
bodits2__ds_ppp_tst
bodits2__ds_pri_tst
于 2012-08-15T16:36:45.123 回答
0

这段代码:

while ($subject =~ m/^(?:(?!_iq_).)*$/g) {
    print $&, "\n";
}

将打印除这两个字符串之外的所有内容。您可以通过在(?!_iq_).

示例测试:

在此处输入图像描述

于 2012-08-15T16:42:06.370 回答
0

我看到了您的编辑,不确定是否会排除您想要包含的内容,但我尝试了这个,它对我有用。

#!/usr/bin/perl

use strict;
use warnings;

my @words = qw(bodipr2__ds_di_uat
bodipr2__ds_dw_uat
bodipr2__ds_iq_uat
bodipr2__ds_iq_uat_back
bodipr2__ds_itsys_uat
bodipr2__ds_ppp_uat
bodipr2__ds_psd_uat
bodipr2__ds_usage_uat
bodits2__ds_pef_tst
bodits2__ds_ppp_tst
bodits2__ds_pri_tst);

print "Original data\n\n";

foreach my $print (@words)
{
    print "$print\n";
}

print "\nNew data\n\n";

foreach my $word (@words)
{
    next if $word =~ /bodi[a-z]+\d__[a-z]+_iq_[a-z]+/;
    print "$word\n";
}
于 2012-08-15T16:44:02.013 回答