&&
||
論理文字列の組み合わせとそれに対応する開き括弧と閉じ括弧を検証する正規表現を作成しようとしてい()
ます。
私は正規表現の象形文字パターンをいじっていますが、主に正規表現パターンを完全に理解していないために、正しく機能していないようです。
数時間の 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)"