Разбор определения таблицы SQL с использованием регулярного выражения в Java - PullRequest
1 голос
/ 05 сентября 2011

Я пытаюсь разобрать скрипт создания таблицы SQL в Java.

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

Pattern p = Pattern.compile("(.+)([ ]+)(.+)([ ]+)(.+)");

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

И это используется следующим кодом:

Matcher m = p.matcher(field);
if(m.find()){
    String column = m.group(1).trim();
    String type = m.group(3).trim();
    String clauses = m.group(5).trim();
}

И все же, когда я запускаю это:

firstColumn         varchar(4)   not null,

Первая группа:

firstColumn         varchar(4)

Я ожидаю, что три извлеченные поля будут firstColumn, varchar (4) и не равны NULL соответственно.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011
2 голосов
/ 05 сентября 2011

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

Попробуйте что-то вроде этого:

String input = "firstColumn         varchar(4)   not null,";

Pattern p = Pattern.compile("(.+?)\\s+(.+?)\\s+(.*)");
Matcher m = p.matcher(input);

if (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
}

Выход:

firstColumn
varchar(4)
not null,
0 голосов
/ 05 сентября 2011

Другой вариант (ИМХО предпочтительный) для ленивого сопоставления указывает символы, которые могут встречаться в слове, а именно:

([^ ]+)([ ]+)([^ ]+)([ ]+)(.+)([ ]+)

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

Кстати, тип данных может по-прежнему содержать пробелы (например, CHAR(20) CHARACTER SET xxxxx, также могут быть разделены скобки), поэтому этот подход на самом деле не сработает.

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