Как заменить конкретную строку в JAVA? - PullRequest
0 голосов
/ 23 января 2012

У меня есть строка как

order by o desc,b asc

Здесь я хочу заменить o и b столбцов этого пункта на table_ o и table_ b и вывести

order by table_o desc, table_b asc

Я использую функцию замены для этого, но вывод будет выглядеть как

table_order table_by table_o desc,table_b asc

Как решить эту проблему с помощью регулярного выражения?

Еще один пример

"order by orders desc, bye asc"

следует заменить на

"order by table_orders desc, table_bye asc"

Ответы [ 5 ]

2 голосов
/ 23 января 2012

Вот одно из возможных решений.[Возможно, вам придется настроить пробелы вокруг 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 )?(\w+)( desc| asc)?(,|$)


Сведения о регулярном выражении

  • (.*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 грамматик

0 голосов
/ 23 января 2012

Вы можете использовать подобный код для преобразования вашего текста:

String sql = "select o, b, c,d form Table order by orders ,b asc, c desc,d desc, e";
String text = sql.toLowerCase();
String orderBy = "order by ";
int start = text.indexOf(orderBy);
if (start >= 0) {
    String subtext = text.substring(start+orderBy.length());
    System.out.printf("Replaceed: [%s%s%s]%n", text.substring(0, start), orderBy, subtext.replaceAll("(\\w+)(\\s+(?:asc|desc)?,?\\s*)?", "table_$1$2"));
}

ВЫХОД:

Replaceed: [select o, b, c,d form table order by table_orders ,table_b asc, table_c desc,table_d desc, table_e]
0 голосов
/ 23 января 2012

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

" o "

" b "
0 голосов
/ 23 января 2012

Возможно, вы ищете это? Регулярные выражения в Java SE & EE Взгляните на главу Регулярные выражения , которая будет выполнять работу большую часть времени.

0 голосов
/ 23 января 2012

Просто используйте пробел в функции замены (вам не нужно регулярное выражение). Псевдо-код:

string = string_replace(string, " o ", " table_o ")

Edit:

После вашего примера вы можете указать любую допустимую границу между [и]. Затем регулярное выражение будет соответствовать. Чтобы вернуть исходную границу, поместите ее между (и) и замените ее обратно.

например:.

string = regex_replace(string, "([ \t])o([ \t,])", "\1o\2")

\ 1 и \ 2 могут отличаться в вашей реализации регулярных выражений. Также я бы предложил уточнить ваш случай, чтобы было ясно, что вы действительно хотите заменить, а также взглянуть на предложение Истины о проблеме XY.

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