Вот одно из возможных решений.[Возможно, вам придется настроить пробелы вокруг desc
asc
и ,
на основе вашего фактического SQL]
String str = "select a,b,c * from Table order by o desc,b asc,c,d";
System.out.println(str.replaceAll(
"(.*order by )?(\\w+)( desc| asc)?(,|$)", "$1table_$2$3$4"));
Результат
select a,b,c * from Table order by table_o desc,table_b asc,table_c,table_d
Визуальное регулярное выражение
Сведения о регулярном выражении
(.*order by)?
=> будет соответствовать выбору a, b, c *из таблицы упорядочить по => назад ref $ 1 (\\w+)
=> будет соответствовать имени столбца => back ref $ 2 ( desc| asc)?
=> будет соответствовать desc или asc => back ref $ 3 (,|$)
=> будет соответствовать запятой или концу строки => back ref $ 4
Обратите внимание : это решение работает только с простыми запросами sql,и приведет к неверному результату, если предложение order by
является частью внутреннего запроса сложного SQL.Более того, Regex не может не быть идеальным инструментом для синтаксического анализа SQL
Смотрите эту ссылку Регулярное выражение для соответствия общему синтаксису SQL?
При полном разборе SQLДля анализа SQL лучше использовать парсеры SQL или генераторы парсеров, такие как ANTLR.См. эту ссылку для получения списка доступных ANTLR SQL грамматик