匹配模式TEXT [0,0]

时间:2012-11-06 09:49:13

标签: c# .net regex

我有很多带有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]匹配,因为它不在双引号内。

2 个答案:

答案 0 :(得分:1)

这是你所寻求的正则表达式模式(根据评论编辑):

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

我使比赛非贪婪(.*?),以防一条线上有多个比赛(不太可能,但为了完整性......)

被修改

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

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

答案 1 :(得分: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+)*\])"