我有像
这样的字符串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"
答案 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
(.*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]