如何在JAVA中替换特定的字符串?

时间:2012-01-23 09:47:19

标签: java regex

我有像

这样的字符串
order by o desc,b asc

我希望在table_ o table_ b 中替换此子句的 o和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 个答案:

答案 0 :(得分:2)

这是一种可能的解决方案。 [您可能需要根据实际的SQL调整desc asc,周围的空格

    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

Visual Regex (.*order by )?(\w+)( desc| asc)?(,|$)


正则表达式详细信息

  • (.*order by)? =&gt;将匹配从表顺序中选择a,b,c * by =&gt; back ref $ 1
  • (\\w+) =&gt;将匹配列名=&gt;返回ref $ 2
  • ( desc| asc)? =&gt;将匹配desc或asc =&gt;返回ref $ 3
  • (,|$) =&GT;将匹配尾随逗号或endof line =&gt;返回ref $ 4

请注意:此解决方案仅适用于简单的SQL查询,如果order by子句是复杂SQL的内部查询的一部分,则会产生错误的结果。而且Regex并不是解析SQL语法的理想工具

请参阅此链接Regular expression to match common SQL syntax?


如果需要完全成熟的SQL解析,最好使用SQL解析器或像ANTLR这样的解析器生成器来解析SQL。有关可用this link

的列表,请参阅ANTLR SQL grammer

答案 1 :(得分:0)

只需在替换功能中使用空格(您不需要正则表达式)。 伪代码:

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

编辑:

在你的例子之后,你可以但[和]之间的每个有效边界。然后正则表达式将匹配。要取回原始边界,将其置于(和)之间并将其替换回来。

E.g:

string = regex_replace(string, "([ \t])o([ \t,])", "\1o\2")
正则表达式实现中

\ 1和\ 2可能有所不同。 此外,我建议澄清你的案例,以便明确你真正想要替换的内容,并看看真理对XY问题的建议。

答案 2 :(得分:0)

如果您只想替换这样的文本,只需使用这些正则表达式:

" o "

" b "

答案 3 :(得分:0)

可能你在寻找这个? Regular Expressions in Java SE & EE
看看Regular Expressions章节,大部分时间都会做这项工作。

答案 4 :(得分:0)

您可以使用此类代码转换文字:

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]