【问题标题】:Regex search keyword in parentheses括号中的正则表达式搜索关键字
【发布时间】:2019-11-17 13:46:46
【问题描述】:

我想在括号中搜索关键字 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 )。但它匹配所有。

【问题讨论】:

    标签: c# sql regex


    【解决方案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);
            }
        }
    }
    

    正则表达式电路

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

    【讨论】:

    • 您好,我尝试使用文本模式运行您的正则表达式。 (从 Table_Name A WITH(NOLOCK) WHERE Col1>0 GROUP BY Col1 中选择 Col1)。它失败了。我猜原因是括号中的 NOLOCK
    【解决方案2】:

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

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

    这会准确提取您要查找的内容;即带有GROUP BY 子句的子查询。

    【讨论】:

    • @downvoter:说明原因会有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2022-07-28
    相关资源
    最近更新 更多