2

編集:ごめんなさい!私は前にこれについて言及すべきでした。あなたの答えでは、以下にリストされている項目が私が検索しているディレクトリ内の唯一のものであると思い込まないでください。これらは、指定された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

を含む2つを省略したい場合を除いて_iq_。だから私はこのような表現を書きました:

bodi.*?__ds[^_iq_]

しかし、それはそれらのすべてを省略します。私がこれを試してみると:

bodi.*?__ds_[^iq]

それは1つを省略し_itsys_ます。「i」や「q」を含まないものすべてに一致していると思います。その場所に含まれていないものは省略してほしい'_iq_'

私もこれを聞かなければならないのは恥ずかしいですが、誰かが私を正しい方向に向けることができれば、私は本当に感謝します。

4

7 に答える 7

4

これを試してください: http://regexr.com?31rhobod[a-z\d]+__ds_(?!iq_)\w+
からテストしました

于 2012-08-15T16:36:05.060 に答える
3

そして、あなたが試したことが( [^iq])うまくいかなかった理由を説明するために、それ[^iq]は「文字が「i」または「q」である場合を除いて、任意の1文字に一致することを意味するためです。また[^_iq_]、「_」にも一致することを除いて同じことを意味します。

だから、あなたの場合、

  • bodi.*?__ds[^_iq_]すべての単一の sring に一致する「ds」の後に「_」が含まれているため、それらの 100% に一致します。[^_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";
}

これらの 2 つの文字列を除くすべてを出力します。の後に否定的な先読みを追加することで、これを拡張できます(?!_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 に答える