Regex разделяется запятыми - не в скобках или одинарных кавычках - PullRequest
0 голосов
/ 02 января 2019

У меня есть следующий оператор SQL, который я пытаюсь разбить на столбцы:

select 
    count(rtnotes.keyno) as value,
    ent.company as label, 
    'j-ChartDrillDown-406,'+CAST(ENT.ENTID AS CHAR(10)) AS link, 
    dateadd(week, datediff(wk, 0, dateadd(wk,-5,getdate())), -1) as test
    ...

Я хочу разделить его на 4 столбца в операторе выбора:

  1. count(rtnotes.keyno) as value
  2. ent.company as label
  3. 'j-ChartDrillDown-406,'+CAST(ENT.ENTID AS CHAR(10)) AS link
  4. dateadd(week, datediff(wk, 0, dateadd(wk,-5,getdate())), -1) as test

Мне удалось разделить запятыми не в кавычкахиспользуя:

,(?=(?:[^']*'[^']*')*[^']*$)

, но мне также нужно игнорировать запятые в скобках (вложенные скобки в данном случае из-за dateadd и datediff)

https://regex101.com/r/UUNUF9/1/

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Здесь вам понадобится регулярное выражение.

Регулярное выражение: '[^ select] [^ \ s]. + [()]? [^, | \ S]'

Например, с вашими данными, перейдите по ссылке. https://regex101.com/r/Zhk1JP/2

0 голосов
/ 02 января 2019

(слишком долго для комментария)

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

. Причина в том, что круглые скобки в этом случае подобны открывающим и закрывающим тегам HTML.Более того, вы должны убедиться, что вы обрабатываете такие случаи, как SELECT ':)' AS Smiley или CAST(')' AS NCHAR(1)), в которых круглые скобки могут быть заключены в строковые значения, и это вызовет у вас сильную головную боль.

Однако существуют проекты, подобные SQL Parser , который может помочь вам достичь того, что вы хотите.

...