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 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)?\].*?"

.*?如果一行中有多个匹配项(不太可能,但为了完整性......),我将匹配设置为非贪婪( )

已编辑

目前尚不清楚您是否只想匹配目标字段名称或整个 SQL。如果您只想匹配字段名称,请使用非捕获组:

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

我假设您希望能够匹配的不仅仅是这两个特定字段,否则您就不会遇到应用正则表达式的麻烦:

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 回答