【问题标题】:Can't replace string with regex in java [duplicate]无法在java中用正则表达式替换字符串[重复]
【发布时间】:2016-04-06 14:37:09
【问题描述】:

我正在尝试替换查询中出现的字符串,如下所示:

SELECT * FROM DB WHERE AGE = 3 and NAME = 'VALUE'

我正在使用这个正则表达式:NAME\s*=\s*'[A-Z]+' 工作正常 here

这就是我在 Java 中尝试过的方式:

query.replaceAll("NAME\s*=\s*'[A-Z]+'", replacementString); // Gives me Invalid escape sequence message
query.replaceAll("NAME\\s*=\\s*'[A-Z]+'", replacementString); 

Pattern pattern = Pattern.compile("NAME*= *'[A-Z]*'");
query.replaceAll(pattern.pattern(), replacementString);

Pattern pattern2 = Pattern.compile("NAME\\s*=\\s*'[A-Z]*'");                
query.replaceAll(pattern2.pattern(), replacementString);

这些都不起作用。

如何替换 NAME = 'VALUE' 的出现?

【问题讨论】:

  • 转义反斜杠:\\s* 修复“无效转义序列”错误。
  • 注意事项:确保“VALUE”永远不包含',否则简单的正则表达式就不够用了。
  • 问题出在query.replaceAll(pattern2.pattern(), replacementString); - 您需要将值分配给字符串变量。
  • VALUE 从不包含'
  • "NAME\\s*=\\s*'[A-Z]*'" 可以使用。您也可以使用"NAME\\s*=\\s*'[^']*'"。如果您需要使用已编译的模式,请将其与 Matcher 一起使用,请参阅demo。但这只是一种增强。您的主要问题是修改后的值分配。

标签: java regex


【解决方案1】:

Java 字符串是不可变的。

您需要将replaceAll 回调的结果分配给字符串:

query = query.replaceAll(...);

【讨论】:

【解决方案2】:

试试这个,

query.replaceAll("NAME\\s*=\\s*'[A-Z]+'", replacementString); 
query.replaceAll("NAME\\s*=\\s*'[A-Z]+'", replacementString);

然后在你的模式中,

Pattern pattern2 = Pattern.compile("NAME\\s*=\\s*'[A-Z]*'");                
query.replaceAll(pattern2.pattern(), replacementString);

【讨论】:

  • 如果 OP 想先编译模式怎么办?
  • 已经试过了,不行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多