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

Проблема, с которой я сталкиваюсь:

-У меня есть строка ввода, SQL-оператор, который мне нужно проанализировать

-экстракт значения, которое необходимо вставить на основе имени столбца, укажите

-i может извлечь значение, заключенное в две одинарные кавычки, но:

-? А как насчет значения, в котором нет одинарных кавычек? (например, целое или двойное число)

- что если значение внутри уже содержит одинарные кавычки? (например: «Словарь Джеймса»)

Ниже приведен пример входной строки:

INSERT INTO LJS1_DX (base, doc, key1, key2, no, sq, eq, ln, en, date, line) 
VALUES ('GET','','#000210','','   0','   1','5',1,0,'20100706','Street''James''s dictionary')

Java-код, который у меня ниже, соответствует значению только двух одинарных кавычек:

 Pattern p = Pattern.compile("'.*?'");
 columnValues = "'GET0','','#000210','','   0','   1','5',1,0,'20100706','Street''James''s dictionary'";
 Matcher m = p.matcher(columnValues); // get a matcher object
 StringBuffer output = new StringBuffer();
 while (m.find()) {
  logger.trace(m.group());
 }

Благодарим вас за то, что кто-то может предоставить какие-либо указания или примеры по этому вопросу.

Спасибо !!

Ответы [ 6 ]

3 голосов
/ 30 июля 2010

Я согласен с gnibbler, что это работа для парсера csv.

Регулярное выражение, которое работает на вашем примере, будет

'(?:''|[^'])*'|[^',]+

, которое выглядит сложным для отладки и поддержки, не так ли?не так ли?

Объяснение:

'            # First alternative: match an "opening" '
 (?:         # followed by either...
  ''         # two ' in a row (escaped ')
 |           # or...
  [^']       # any character that is not a '
 )*          # zero or more times,
'            # then match a "closing" '
|            # or (second alternative):
[^',\s]+     # match any run of characters except ', comma or whitespace

Это также работает, если между значениями / запятыми есть пробел (и он будет пропущен).

1 голос
/ 30 июля 2010

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

Анализатор CSV, такой как opencsv , возможно, является лучшим вариантом

0 голосов
/ 30 июля 2010

Я думаю, у Тима была правильная идея;это просто необходимо реализовать более эффективно.Вот гораздо более эффективная версия:

'[^']*+(?:''[^']*+)*+'|[^',\s]++

Она использует технику «развернутого цикла» Фридла, чтобы избежать чрезмерной зависимости от чередований, которые соответствуют одному или двум символам одновременно (я думаю, это то, что вы сделали, Тим)плюс квантификаторы притяжения во всем.

0 голосов
/ 30 июля 2010

Регулярные выражения нелегко использовать с этим (но все возможно).

Я бы предложил разобрать его самостоятельно или использовать библиотеку для анализа. Написав парсер самостоятельно, вы уверены, что он работает именно так, как вам нужно.

0 голосов
/ 30 июля 2010

Вместо этого вы можете получить все значения, используя subString после ключевого слова Values.Точно так же мы можем получить имена.тогда у вас будет две разделенные запятыми строки, которые можно преобразовать в массив, и у вас будут массивы для имен и значений.затем вы можете проверить, какой параметр имеет какое значение.

надеюсь, это поможет.

0 голосов
/ 30 июля 2010

В общем, когда вам нужно проанализировать сложные языки, регулярные выражения не лучший инструмент - слишком много контекста, чтобы иметь смысл. Таким образом, если для чтения XML используется синтаксический анализатор XML, если для чтения кода C используется синтаксический анализатор языка C, а для чтения SQL ...

Здесь есть синтаксический анализатор Java SQL здесь , я бы использовал что-то вроде этого.

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

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