C# 匹配模式文本[0,0]
我有很多SQL查询的源代码,如下所示:C# 匹配模式文本[0,0],c#,.net,regex,C#,.net,Regex,我有很多SQL查询的源代码,如下所示: c_query := "SELECT * FROM TABLE WHERE FIELD_NAME_ONE[2] = 'AB' AND FIELD_NAME_TWO[1,8] = 'ABCDEFGH'" 我想匹配这些:FIELD\u NAME\u ONE[2]和FIELD\u NAME\u TWO[1,8],这些模式必须在双引号(“)之间找到 编辑 c_query:=“从表中选择*,其中字段_NAME_ONE[2]=“AB”和字段_NAME_TWO[1,8
c_query := "SELECT * FROM TABLE WHERE FIELD_NAME_ONE[2] = 'AB' AND FIELD_NAME_TWO[1,8] = 'ABCDEFGH'"
我想匹配这些:FIELD\u NAME\u ONE[2]
和FIELD\u NAME\u TWO[1,8]
,这些模式必须在双引号(“
)之间找到
编辑
c_query:=“从表中选择*,其中字段_NAME_ONE[2]=“AB”和字段_NAME_TWO[1,8]=“ABCDEFGH”和TESTE[9]=“XXXXXXXXX”和FOO=”“+是一个数组[2]+””
它不应该与is an array[2]匹配,因为它不在双引号内。这里有一个正则表达式模式,用于搜索内容(根据注释编辑): 我将匹配设置为非贪婪(
*?
),以防一行上有多个匹配(不太可能,但为了完整性…)
编辑
不清楚是只匹配目标字段名还是整个SQL。如果只匹配字段名,请使用非捕获组进行其余匹配:
(?:".*?)[A-Z_]+\[\d(,\d)?\](?:.*?")
我假设您希望能够匹配的不仅仅是这两个特定字段,否则您就不会在应用正则表达式时遇到麻烦:
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+)*\])"
但是我可以在方括号和括号内的随机数之前有许多其他文本…..A1_NOME[5],F2_NOME[3,5],等等…..N[x,y]@也许你应该在你的问题中这样说。参见编辑后的答案。索引有多大-例如你能得到
字段[999999]
?所有字段名称都是大写的吗?但我可以在同一个字符串中有多个查询,如何才能进行查询。这更复杂。查询本身是否包含任何(可能转义的)双引号?例如:select*from table where col=“‘嘿,好了,’”他说。
@"([a-zA-Z_]+\[\d+(,\d+)*\])"