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

Posted

技术标签:

【中文标题】括号中的正则表达式搜索关键字【英文标题】: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 )。但它匹配所有。

【问题讨论】:

【参考方案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:说明原因会有很大帮助!

以上是关于括号中的正则表达式搜索关键字的主要内容,如果未能解决你的问题,请参考以下文章

忽略正则表达式搜索中的模式错误,不要使搜索崩溃

mysql全文匹配搜索字串中含圆括号()怎么办?

如何用正则表达式匹配括号中的内容,不包含括号

正则表达式如何匹配提取括号中的内容

如何用正则表达式匹配括号中的内容。

正则表达式匹配括号内的内容