括号中的正则表达式搜索关键字
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:说明原因会有很大帮助!以上是关于括号中的正则表达式搜索关键字的主要内容,如果未能解决你的问题,请参考以下文章