我有很多带有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]匹配,因为它不在双引号内。
答案 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+)*\])"