0

以下のようなSQLクエリを含むソースコードがたくさんあります。

c_query := "SELECT * FROM TABLE WHERE FIELD_NAME_ONE[2] = 'AB' AND FIELD_NAME_TWO[1,8] = 'ABCDEFGH'"

これらを一致させたい:FIELD_NAME_ONE[2]そしてFIELD_NAME_TWO[1,8]これらのパターンは二重引用符()の間にある必要があります"

編集

c_query:= "SELECT * FROM TABLE WHERE FIELD_NAME_ONE [2] ='AB' AND FIELD_NAME_TWO [1,8] ='ABCDEFGH' AND TESTE [9] ='XXXXXXXXX' AND FOO ='" + is_an_array [2] + "' 「」

は二重引用符で囲まれていないため、is_an_array[2]と一致しないようにする必要があります。

4

2 に答える 2

1

求めるものの正規表現パターンは次のとおりです(コメントに基づいて編集):

".*?[A-Z_]+\[\d(,\d)?\].*?"

.*?1行に複数の一致がある場合に備えて、一致を貪欲ではありません()(可能性は低いですが、完全を期すために...)

編集済み

ターゲットフィールド名だけを照合するのか、SQL全体を照合するのかは明確ではありません。フィールド名だけを一致させたい場合は、残りの部分にキャプチャしないグループを使用します。

(?:".*?)[A-Z_]+\[\d(,\d)?\](?:.*?")
于 2012-11-06T09:52:54.740 に答える
1

これら 2 つの特定のフィールド以外にも一致させたいと考えていると思います。そうしないと、正規表現を適用する手間がかからないでしょう。

var tokens = Regex.Matches(sql, "\"([^\"]+)\"");

foreach (Match token in tokens) {
    string str = token.Groups[1].Value;

    var fields = Regex.Matches(str, @"(\w+\[\d+(,\d+)*\])");

    foreach (Match field in fields)
        Console.WriteLine(field.Value);
}

これにより、文字、数字、およびアンダースコアの任意のシーケンスが検出され、その後に角括弧が続き、1 つ以上のコンマ区切りの数字が含まれます。

角括弧の前の一連の文字とアンダースコアのみを一致させたい場合は、パターンを次のように修正します。

@"([a-zA-Z_]+\[\d+(,\d+)*\])"
于 2012-11-06T10:00:25.280 に答える