2016-12-08 2 views
0

Это только очень простой процесс SQL синтаксического анализа, не HAVING, ORDER BY или GROUP BY не будет в отчете, который должен быть проанализирован, но что-то соответствие звездочки в SELECT, часть не будет работать (например, SELECT * .......)Regex - SQL заявление

Вот часть кода:

String span="SELECT * FROM table1 t, table2"; 

span=span.toUpperCase(); 

System.out.println(span); 

// Segments 
String column="(\\w+\\s*(\\w+\\s*){0,1})"; 

String columns=column+"(,\\s*"+column+")*"; 

String ownerenable="((\\w+\\.){0,1}\\w+\\s*(\\w+\\s*){0,1})"; 

String ownerenables=ownerenable+"(,\\s*"+ownerenable+")*"; 

String from="FROM\\s+"+columns; 

String condition="(\\w+\\.){0,1}\\w+\\s*(=|<|>|LIKE|IS)\\s*'?(\\w+\\.){0,1}[\\w%]+'?"; 

String conditions=condition+"(\\s+(AND|OR)\\s*"+condition+"\\s*)*"; 

String where="(WHERE\\s+"+conditions+"){0,1}"; 

String pattern = "SELECT\\s+(\\*|" + ownerenables + "\\s+" + from + ")\\s+" + where + "\\s*" + "(;){0,1}"; 

System.out.println(pattern); 
System.out.println(span.matches(pattern)); 

Теперь, если я установить срок, чтобы что-то вроде

"SELECT t.id, product p FROM table1 t, table2 WHERE t.id=10;" 

Результат матча будет верно

================================

Но если установить его на что-то вроде этого:

"SELECT * FROM table1 t, table2 WHERE t.id=10;" 

(это звездочка я использую для SELECT)

Он не будет работать в этом случае

Я делаю что-то неправильно в этой звездочке?

+0

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

+0

@Maurice Перри Да ... Но я m просто делал простой тест здесь и возникла проблема. – RushSykes

+0

OK. вы можете использовать ? вместо {0,1} –

ответ

1

Скобки должны быть закрыты перед темfrom:

String pattern = "SELECT\\s+(\\*|" + ownerenables + ")\\s+" + from + "\\s+" + where + "\\s*" + "(;){0,1}"; 
+0

Спасибо за ответ, я попробовал это, но он все равно не будет соответствовать – RushSykes

+0

Привет. Я попробовал, и это соответствует (по крайней мере, пример, который вы указали выше) –

+0

Упс, поэтому он говорит правду на вашем компьютере, но не на моем ... Странно .... Я пойду и снова посмотрю, спасибо – RushSykes

0

вы выбираете таблицу2, но ничего не выбираете из нее. вы должны указать соединение между table1 и table2, если хотите сделать * select.

Это ваша проблема.

+0

А вот соединение не нужно, даже в реальной системе SQL, я все еще могу это сделать, это не значит, что результат не имеет значения. – RushSykes