Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换JAVA中的特定字符串?_Java_Regex - Fatal编程技术网

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

如何替换JAVA中的特定字符串?,java,regex,Java,Regex,我有一条像绳子一样的线 order by o desc,b asc 在这里,我想用table\uo和table\ub和输出替换本子句的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_

我有一条像绳子一样的线

order by o desc,b asc
在这里,我想用
table\u
o
table\u
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"

只需在replace函数中使用空格(不需要正则表达式)。 伪代码:

string = string_replace(string, " o ", " table_o ")
编辑:

在您的示例之后,您可以只选择[和]之间的所有有效边界。然后正则表达式将匹配is。要恢复原始区域边界,请将其放在(和)之间,然后将其替换回来

例如:

\1和\2在正则表达式实现中可能不同。
此外,我建议澄清您的情况,以便清楚您真正想要替换的内容,并查看Truth对XY问题的建议。

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

" o "

" b "

也许你在找这个
请看一看大多数情况下都能完成工作的章节。

这里有一个可能的解决方案。[您可能需要根据实际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)?
    =>将匹配从order by=>back ref$1表中选择a、b、c*
  • (\\w+)
    =>将匹配列名=>返回参考$2
  • (desc | asc)?
    =>将匹配desc或asc=>返回参考$3
  • (,|$)
    =>将匹配尾随逗号或尾随行=>后参考$4
请注意:此解决方案仅适用于简单的sql查询,如果
orderby
子句是复杂sql内部查询的一部分,则会产生错误的结果。此外,正则表达式不是解析SQL语法的理想工具

请参阅此链接



如果需要完整的SQL解析,最好使用SQL解析器或ANTLR之类的解析器生成器来解析SQL。有关可用的列表,请参见。您可以使用以下代码转换文本:

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]

这似乎是一个经典的XY问题(谷歌it),你想实现什么?绳子是从哪里来的?这是用什么语言写的?正则表达式有一个特殊的标记-请使用它。@SRK他的意思是标记问题。这是hilariousI尝试使用空间本身…但在某些情况下它不起作用,这就是为什么我要求使用正则表达式。那么请给出它不起作用的情况。空间是您正在陈述的当前问题的解决方案,因此您必须进一步定义它!还可以看到真理对XY问题的非常真实的评论。你没有明白。。。假设我的字符串是“order by ord”,那么使用str.replace(“ord”)是行不通的,因为它后面有逗号……好吧,你没有提到任何关于逗号可能在你试图替换的东西之后开始的事情。这就是为什么我说:给出正确的例子…我认为你需要让我们帮助你,而不是认为你是对的,世界其他地方没有得到它我尝试使用空间本身…但有一些情况下它不起作用,这就是为什么我要求使用正则表达式。什么情况?如果你想让我们能帮助你,你需要举一个更准确的例子。你没有明白。。。假设我的字符串是“order by ord”,那么使用str.replace(“ord”)将不起作用,因为它后面有逗号..啊,那么你可以使用
“ord[,.;:]”
(添加你认为合适的任何其他字符)谢谢…它起作用了。。现在,如果不使用table替换,假设有一个字符串变量str包含要替换的字符串,那么如何写入?@SRK尝试此
“$1”+tableStr+“$2$3$4”
其中
tableStr
是包含替换字符串的变量是的,您的解决方案甚至不适用于这样的查询“从a>=5和b中选择*尽管在上面的正则表达式中将其更改为
(,|$|$)
对查询有效,但一般的解决方案是在构造SQL查询时进行此替换。”。如果这不是一个选项,您可能需要考虑使用SQL解析器或分析器生成器来解析SQL。
Replaceed: [select o, b, c,d form table order by table_orders ,table_b asc, table_c desc,table_d desc, table_e]