3

ABC、DBE、ABE、FBG などを含み、XBZ を含まないすべてのシーケンスに一致する正規表現を作成するにはどうすればよいですか?

私の例のシーケンス ABC、DBE などは単に代表的なものにすぎません。私はそれらの特定のパターンを探していません。A、B、C、D、E などは、任意のパターンの形を取ることができます。たとえば、X、B、および Z は単語にすることができます。

具体的には、B を含むが、前に X がなく、後に Z がないすべてのインスタンスを探しています。

grep -vマッチングを反転するオプションを使用して、回避策を考え出しました。

cat file | grep -ne ".*B.*" | grep -ve "XBZ"

しかし、私は単一の正規表現を使用したいと考えています。

4

7 に答える 7

2

これは、仕事をするためのperlの方法です:

my $re = qr/(?<!X)B(?!Z)/;
while(<DATA>) {
    chomp;
    say /$re/ ? "OK : $_" : "KO : $_";
}
__DATA__
ABC
DBE
ABE
FBG
XBZ

出力:

OK : ABC
OK : DBE
OK : ABE
OK : FBG
KO : XBZ

説明:

(?-imsx:(?<!X)B(?!Z))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?<!                     look behind to see if there is not:
----------------------------------------------------------------------
    X                        'X'
----------------------------------------------------------------------
  )                        end of look-behind
----------------------------------------------------------------------
  B                        'B'
----------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
    Z                        'Z'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
于 2013-06-28T12:32:21.313 に答える
1

人々はこの問題を考えすぎていると思います。正規表現を特定のシーケンスのセットに一致させたいが、他の特定のシーケンスには一致させたくないという質問を正しく理解していれば、答えは単純に、一致しないものを正規表現に伝える必要がないということです。指定したパターンに一致するものだけに一致し、それ以外には一致しません。ABC|DBE|ABE|FBGABC または DBE または ABE または FBG と一致し、XBZ を含む他のシーケンスとは一致しません。XBZ と一致しないように特に指示する必要はありません。

于 2013-06-27T20:54:20.257 に答える
1

コメントの仮定に基づいて正規表現を作成する関数を作成しました。仮定は次のとおりです。

  • これらは3つの文字列です
  • 文字 1 はアルファベットから取得されます
  • キャラクター 2 は常に同じです。OPの投稿では、これはBです.
  • 文字 3 は文字 1 + 1 です。
  • 文字 1 と文字 3 は文字 2 と同じにすることはできません。

    static void writeRegex(char skip)
    {
    string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    StringBuilder sb = new StringBuilder();
    sb.Append("^(");
    char one = 'A';
    char two = 'B';
    bool first = true;
    for (; one < 'Z' && two <= 'Z' ; )
    {
        if (!first)
        {
            sb.Append("|");   
        }
        first = false;
    
        if (one == skip)
        {
            one++;
        }
        if (two == skip || one == two)
        {
            two++;
        }
    
        sb.Append(one.ToString() + skip.ToString() + two.ToString());
    
        one++;
        two++;
    }
    sb.Append(")$");
    
    using (StreamWriter outfile = new StreamWriter(mydocpath + @"\Regex.txt"))
    {
        outfile.Write(sb.ToString());
    }
    

    }

'B' を入力すると、次のようになります。

^(ABC|CBD|DBE|EBF|FBG|GBH|HBI|IBJ|JBK|KBL|LBM|MBN|NBO|OBP|PBQ|QBR|RBS|SBT|TBU|UBV|VBW|WBX|XBY|YBZ) $

否定はなく、3 つの文字のすべての受け入れ可能な構成の総当たりのみです。

于 2013-06-27T17:37:02.810 に答える