括号中的正则表达式搜索关键字

时间:2019-07-08 03:56:55

标签: c# sql regex

我想在括号中搜索关键字GROUP BY。

这是我的正则表达式模式:

(?i)(\s+|^)\(\s*((.|\n)*)GROUP\s+BY\s+((.|\n)*)\s*\)

但是,它匹配所有数字,以防万一(..GROUP BY ..)用另一个括号括起来。

示例,这是文本模式:

(SELECT Col1 FROM Table_Name A WITH(NOLOCK) WHERE Col1>0 GROUP BY Col1)

(SELECT  column1, column2
FROM Table_name1)

 INNER JOIN (                                            
 SELECT column1, column2
 FROM   Table_name2     
 WHERE  column1 > 0                                                      
 GROUP BY column1, column2   
 ) AS TN

我要匹配(SELECT column1, column2 FROM Table_name2 WHERE column1 > 0 GROUP BY column1, column2 )。但这一切都匹配。

2 个答案:

答案 0 :(得分:1)

如果我们没有嵌套的查询/括号,我想带有i标志的简单表达式可能会起作用:

(\([^)]*?\bgroup\b\s+\bby\b[^)]*?\))

,我们也许可以进一步简化它。否则,为其设计表达式将非常复杂。


该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。


测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(\([^)]*?\bgroup\b\s+\bby\b[^)]*?\))";
        string input = @"(SELECT  column1, column2
FROM Table_name1)

 INNER JOIN (                                            
 SELECT column1, column2
 FROM   Table_name2     
 WHERE  column1 > 0                                                      
 GROUP BY column1, column2   
 ) AS TN

(SELECT  column1, column2
FROM Table_name1)

 INNER JOIN (                                            
 SELECT column1, column2
 FROM   Table_name2     
 WHERE  column1 > 0                                                      
 GROUP BY column1, column2   
 ) AS TN";
        RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:1)

为什么不使用最简单的版本呢?

\([^(]*GROUP BY[^)]*\)

这将完全提取您要查找的内容;即带有GROUP BY子句的子查询。