6

&& ||論理文字列の組み合わせとそれに対応する開き括弧と閉じ括弧を検証する正規表現を作成しようとしてい()ます。

私は正規表現の象形文字パターンをいじっていますが、主に正規表現パターンを完全に理解していないために、正しく機能していないようです。

数時間の StackOverflow とグーグルの後、これは私がこれまでに持っているものであり、私は近いと感じています。

    private void ValidationTest()
    {
        string hieroglyphics = @"^(?=^[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)[^()]*$)[(]*\d+[)]*(\s+(&&|\|\|)\s+[(]*\d+[)]*)*$";

        var tests = new List<string>
        {
            // Working
             "(1 && 2)",
             "((1 && 2) && (3 || 4))",
             "((1 && 2) && (3 || 4) || ((1 && 2) && (3 || 4)))",

            // Not working
            "(Stack && Overflow)"
        };

        if (tests.All(test => Regex.IsMatch(test, hieroglyphics)))
        {
            MessageBox.Show("Woohoo!!");
        }
    }

したがって、私がこれまでに持っているものの主な問題は、括弧がない場合1 && 2、検証されないこと(1 && 2) && (3 || 4)です. また、単語を完全に無視しているようです(Stack && Overflow)

検証しようとしている文字列の例。

"IsRecording && IsPlaying"
"IsVisible && (IsPlaying && (IsMusic || IsRadio))"

物事を台無しにする可能性のあるブレーキを含むいくつかのキーワードもあります例:

"IsWindowVisible(2) && (IsControlVisible(22) && IsControlFocused(100))"

編集: 現在、この式は必要な種類の複雑さを検証するのにうまく機能しますが、私が持っている唯一の本当の問題は、その数値のみです。

これで問題なく検証される複雑な例Regex

"((1 && 2) && (3 || 4) || ((1 && 2) && (3 || 4)))"

単純な文字列1 && 2は括弧なしでは検証されませんが、これらに括弧を追加してもかまいません。

必要なのは、数字だけでなく単語のサポートを追加することだけです。それが役立つ場合、これは単語の固定リストになります。

誰かがエラーを見つけたり、私をより良い方向に向けたりすることができれば、素晴らしいでしょう ありがとう

編集:

mellamokbによる回答は完璧に機能しました。トラブルがd+必要だったようです0-9a-zA-Z()

他の人に役立つ場合のパターンを次に示します。

   string hieroglyphics = @"^(?=^[^()]*(?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))[^()]*$)[(]*[0-9a-zA-Z()]+[)]*(\s+(&&|\|\|)\s+[(]*[0-9a-zA-Z()]+[)]*)*$";

それは私が必要とするものを正確に検証します

例:

 "IsPlayer(Video) && Player(Playing)",
 "((IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34))) || (IsPlayer(Video) && (Player(Playing) && ControlIsVisible(34)))) && ControlIsFocused(22)"
4

1 に答える 1

1

()ラッピングなしで式を検証できない理由は、コアのネスト ロジックで括弧がラッピングされているためだと思います。以下に示す次の括弧を削除すると、ラップされていない他の 2 つの式が有効になります。

^(?=^[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)[^()]*$...
           ^^ remove this                            remove this ^^

\d次に、数値だけではない式を許可するために、制限を検証したいもののより自由な定義に置き換える必要があります[0-9a-zA-Z]

...[(]*\d+[)]*(\s+(&&|\|\|)\s+[(]*\d+[)]*)*$
       ^^ change these expression ^^

したがって、次のようになります。

...[(]*[0-9a-zA-Z]+[)]*(\s+(&&|\|\|)\s+[(]*[0-9a-zA-Z]+[)]*)*$

デモ: http://ideone.com/jwkcpL

于 2013-02-06T00:01:22.357 に答える