Java replaceAll()正则表达式不起作用

我正在尝试用“%”替换所有特殊字符,例如:

"123.456/789" -> "123%465%798" 

我的正则表达式是:

 [^a-zA-Z0-9]+ 

在在线工具*它完美地工作,但在java中

 s.replaceAll("[^a-zA-Z0-9]+", "%"); 

字符串保持不变。

*我试过: http : //www.regexplanet.com/ http://regex101.com/和其他人

字符串是不可变的。 你忘了将新String重新分配给s变量:)

 s = s.replaceAll("[^a-zA-Z0-9]+", "%"); // ^ this creates a new String 

replaceAll()与String类中的所有方法一样,不要修改调用方法的String 。 这就是我们说String是不可变对象的原因。 如果你想“修改”它,你需要做

 s = s.replaceAll("[^a-zA-Z0-9]+", "%"); 

实际上你不修改String s 。 这里发生的是从函数返回新的String对象。 然后将其引用分配给s

您不能更改String,而是replaceAll返回一个新值。 所以你应该像这样使用它

 String newStr = s.replace(...) 

根据您的期望工作代码:)

 import java.util.regex.Pattern; public class Regex { public static void main(String[] args) { String s = "123.456/789"; Pattern p = Pattern.compile("[^a-zA-Z0-9]+"); String newStr = s.replaceAll("[^a-zA-Z0-9]+", "%"); System.out.println(s + " -> " + newStr); } } 

产量: 123.456 / 789 – > 123%456%789