Поиск по ключевым словам в скобках - PullRequest
0 голосов
/ 08 июля 2019

Я хочу найти ключевое слово 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 ]

1 голос
/ 08 июля 2019

Почему бы вам не сделать это с самой простой версией:

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

Это извлекает именно то, что вы ищете; то есть подзапрос с предложением GROUP BY.

1 голос
/ 08 июля 2019

Если бы у нас не было вложенных запросов / скобок, я предполагаю, что это простое выражение с флагом i может работать:

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

и мы могли бы еще больше упростить это. В противном случае было бы довольно сложно разработать выражение для.


Выражение объяснено в верхней правой части этой демонстрации , если вы хотите продолжить изучение или изменить его, а в этой ссылке вы можете посмотреть, как она будет соответствовать если хотите, с некоторыми примерами ввода шаг за шагом.


Test

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 Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...