Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配模式文本[0,0]_C#_.net_Regex - Fatal编程技术网

C# 匹配模式文本[0,0]

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

我有很多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]=“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+)*\])"