строка регулярного выражения Java, разделенная на "not \" - PullRequest
0 голосов
/ 19 декабря 2011

на самом деле мне нужно написать простую программу на JAVA для преобразования строк MySQL INSERTS в файлы CSV (каждая таблица mysql равна одному файлу CSV)

- лучшее решение для использования регулярных выражений в JAVA?

Моя главная проблема, как правильно сопоставить значение следующим образом: 'this is \' cool \ '...' (как игнорировать экранированный символ ')

пример:

INSERT INTO `table1` VALUES ('this is \'cool\'...' ,'some2');
INSERT INTO `table1` (`field1`,`field2`) VALUES ('this is \'cool\'...' ,'some2');

Спасибо

Ответы [ 5 ]

3 голосов
/ 19 декабря 2011

Предполагая, что ваши операторы SQL синтаксически допустимы, вы можете использовать

Pattern regex = Pattern.compile("'(?:\\\\.|[^'\\\\])*'");

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

Пояснение без всех этих дополнительных обратных косых черт:

'         # Match '
(?:       # Either match...
 \\.      # an escaped character
|         # or
 [^'\\]   # any character except ' or \
)*        # any number of times.
'         # Match '

Учитывая строку

'this', 'is a \' valid', 'string\\', 'even \\\' with', 'escaped quotes.\\\''

это соответствует

'this'
'is a \' valid'
'string\\'
'even \\\' with'
'escaped quotes.\\\''
1 голос
/ 19 декабря 2011

Вы можете сопоставлять символы в неэкранированных кавычках, используя это регулярное выражение:

(?<!\\)'([^'])(?<!\\)`

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

В jave вам нужно дважды убежать (один раз для строки, один раз для регулярного выражения), поэтому это выглядит так:

String regex = "(?<!\\\\)'([^'])(?<!\\\\)`";

Если вы работаете в Linux, я бы использовал sed для выполнения всей работы.

0 голосов
/ 19 декабря 2011

Вы должны использовать \\\\.В Java Strings \\ - это один \, поскольку обратная косая черта используется для пробелов или управляющих символов (\n, \t, ...).Но в регулярных выражениях обратная косая черта также представлена ​​знаком '\'.

0 голосов
/ 19 декабря 2011

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

Что-то вроде:

  • find "INSERT INTO"
  • find имя таблицы
  • find имена столбцов
  • find "VALUES"
  • найти набор значений (зацикить эту часть)

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

0 голосов
/ 19 декабря 2011

Четыре обратные косые черты (две для представления обратной косой черты) плюс точка."'(\\\\ |..) *"

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