2015-01-02 2 views
0

Мне нужно извлечь некоторые данные из простого оператора создания sql. Я решил использовать регулярное выражение для этой цели. Все нормально, пока я не положил NOT istead из NOT NULL/NULL, а не specyfiing "nullability" тоже работает (возвращается нуль в группе по назначению). При установке только NOT он пропускает имя столбца.Извлечение данных из оператора sql create с помощью regex

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

String input = "CREATE TABLE IF NOT EXISTS Types_of_classes(" 
    + "columnname INTEGER NOT PRIMARY KEY," 
    + "name TEXT," 
    + "name2 datatype);"; 
    Scanner s = new Scanner(input); 
    s.findWithinHorizon("\\s*CREATE\\s+TABLE(?:\\s+IF\\s+NOT\\s+EXISTS)?\\s+(\\w+)[(]",input.length()); 
    MatchResult result = s.match(); 
    if (1 < result.groupCount()) 
     return; 
    System.out.println(result.group(1));//printing tablename 
    s.findInLine("\\s*(\\w+)\\s+(\\w+)(?:\\s+((?:NOT)?NULL)?)?(?:\\s+(PRIMARY KEY)?)?,"); 
    //there will be added somethind in that regexp to handle FK's too 
    result = s.match(); 
    for (int i = 1; i <= result.groupCount(); i++) 
     System.out.println(result.group(i)); 
    s.close(); 

выход:

Types_of_classes 
INTEGER 
NOT 
null 
PRIMARY KEY 

Любые советы по всему извлечению и т. Д. Также будут оценены!

+1

Я должен спросить, ** почему ** вы это делаете? Что вы пытаетесь сделать (общая картина)? Если вам нужен список типов, используемых в базе данных, вам, вероятно, повезло бы больше после таблиц схемы данных, где db будет собирать всю эту информацию для вас. –

+0

@ Clockwork-Muse Спасибо за ваш ответ, так как я сказал, что любые советы приветствуются. Целью является сопоставление таблиц sql с классами в java. Информационная схема не содержит нулевые или не нулевые данные, idk как насчет ключей? – Rotek

+0

Я могу зависеть от того, что такое ваша РСУБД, но, конечно же, это так - проверить, какая таблица содержит информацию о ограничениях, чтобы начать. Если у него не было этой информации, как вы получаете инструкции 'CREATE TABLE'? Следующая проблема - таблицы и классы обычно не отображаются идеально или, по крайней мере, не для определенных хорошо разработанных систем. Ключевые отношения обычно обратные, как минимум - в OO родитель будет иметь набор дочерних объектов, но в db у детей есть ссылка на родителя. Аудит вывода ... и, вероятно, уже есть библиотека, которая все это выплюнет. –

ответ

0

NULL часть вашего второго регулярного выражения записывается таким образом, что делает его требуется, а пространство после NOT написано таким образом, что делает слово PRIMARY KEY не совпадают, так как вы положили \s+ линии всасывания его, требуя, по крайней мере, один пространство (которое было подобрано место после NOT), вот модифицированную регулярное выражение (сочетание обоих ваших первых и вторых регулярных выражений), который совпадает с первичным ключом колонки часть

\s*CREATE\s+TABLE(?:\s+IF\s+NOT\s+EXISTS)?\s+(\w+)[(]\s*(\w+)\s+(\w+)(?:\s+((?:NOT)?(?:NULL)?)?)?(?:\s+(PRIMARY KEY)?)?, 

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

https://regex101.com/

Смежные вопросы