хочу регулярное выражение, которое будет проверять переменные Java только с одной запятой между - PullRequest
0 голосов
/ 07 июня 2018

У меня есть регулярное выражение, которое я использую для проверки строки.

String s = SELECT column1,column2 GROUPBY column3 AS AliasName
regex = ^SELECT\s+[[a-zA-Z_$][a-zA-Z_$0-9]*,*]+[a-zA-Z_$][a-zA-Z_$0-9]?\s+GROUPBY\s+[[a-zA-Z_$][a-zA-Z_$0-9]*,*]+[a-zA-Z_$][a-zA-Z_$0-9]?\s+AS\s+[a-zA-Z_$][a-zA-Z_$0-9]*$

Эта проверка работает, но мне нужна помощь с изменением регулярного выражения, чтобы она допускала только одну запятую между каждой переменной Java и не допускала ее до первого столбца.

Напримерследующая строка не должна совпадать, но она соответствует:

String s2 = SELECT ,column1,,column2 GROUPBY column3 AS AliasName

Кроме того, я хотел бы изменить ее так, чтобы SELECT, GROUPBY и AS могли быть прописными или строчными.Я знаю, что могу использовать чередование |, но я бы предпочел другой способ.

1 Ответ

0 голосов
/ 07 июня 2018

Попробуйте это так:

(?i)^SELECT ([a-zA-Z_$][a-zA-Z_$0-9]+,)*([a-zA-Z_$][a-zA-Z_$0-9]+) (?:(GROUPBY) ([a-zA-Z_$][a-zA-Z_$0-9]+,)*([a-zA-Z_$][a-zA-Z_$0-9]+))?(?: AS ([a-zA-Z_$][a-zA-Z_$0-9]+))?

Демонстрация онлайн
Пример кода

Самый простойМожно также разрешить использование строчных букв в регулярном выражении без учета регистра, используя встроенный модификатор (?i).

PS: Ваш запрос выглядит неполным.Там нет FROM часть?PPS: Возможно, вы захотите взглянуть на различные решения, поскольку регулярные выражения не могут полностью соответствовать и проверять синтаксис SQL.Вы можете попытаться токенизировать запрос .Или, что еще лучше, используйте вместо этого парсер.ANTLR имеет некоторую грамматику SQL .

...