Java регулярное выражение для разделения списка атрибутов из SQL-запроса в строку [] из attrs - PullRequest
1 голос
/ 11 ноября 2008

В настоящее время у меня есть следующий код:

String select = qry.substring("select ".length(),qry2.indexOf(" from "));
String[] attrs = select.split(",");

, который работает для большинства частей, но не работает, если дано следующее:

qry = "select a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy') from tbl_a";

я ищу регулярное выражение для передачи в String.split (), которое изменит эту ситуацию, и в этом случае в любых других особых случаях вы можете подумать, что я пропускаю.

Ответы [ 4 ]

2 голосов
/ 11 ноября 2008

Ваш ответ в виде цитаты:

Некоторые люди, когда сталкиваются с проблема, подумай "Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы. - Джейми Завински

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

1 голос
/ 11 декабря 2008

Как уже упоминали другие, это на самом деле проблема лексера и парсера, которая намного сложнее, чем просто разбиение строки или регулярное выражение. Вы также обнаружите, что в зависимости от того, какую версию SQL вы используете и какую базу данных вы используете, вы добавляете всевозможные Cogs в ваш анализатор, учитывая множество вариантов, которые вы можете получить в своем SQL. Последнее, что вы хотите сделать, - это сохранить этот кусок кода на своей работе на полный рабочий день, так как вы обнаружите дополнительные крайние случаи, которые выходят из строя.

Я бы задал себе следующие вопросы

  1. Чего вы пытаетесь достичь это лексема? Какие проблемы ты пытаешься решить? Там может быть простое решение, которое не требуется разбор заявления.

  2. Вам нужен весь SQL или просто целевые столбцы / список проекций?

1 голос
/ 12 ноября 2008

Вам, вероятно, повезет больше с парсером SQL .

1 голос
/ 11 ноября 2008
[^,]+\([^\)]+\)|[^,]+,

Должен делать это хорошо, если вы всегда добавляете финальную ',' в строку выбора:

a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy'),f,gg,dr(tt,t,),fff

не сможет разделить последние атрибуты 'fff', но:

a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy'),f,gg,dr(tt,t,),fff,

бы это захватило. Так что небольшая предварительная обработка сгладит все.

Предостережение : это не учитывает выражение в выражении

EXP(arg1, EXP2(ARG11,ARG22), ARG2)

Скажите, может ли это произойти в запросах, которые вы должны обработать.

Предостережение bis : поскольку для этого требуется истинное регулярное выражение, а не простой разделитель, ожидаемый функцией split (), вы должны использовать Matcher, основанный на шаблоне [^,]+\([^\)]+\)|[^,]),, и выполнять итерацию по Matcher.find ( ) заполнить массив атрибутов attrs.

Короче говоря, с функцией split () не существует ни одного простого разделителя, который мог бы добиться цели.

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