我想在括号中搜索关键字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 )
。但这一切都匹配。
答案 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);
}
}
}
jex.im可视化正则表达式:
答案 1 :(得分:1)
为什么不使用最简单的版本呢?
\([^(]*GROUP BY[^)]*\)
这将完全提取您要查找的内容;即带有GROUP BY
子句的子查询。