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

时间:2014-01-29 16:13:46

标签: java regex special-characters

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

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

我的正则表达式是:

[^a-zA-Z0-9]+

在在线工具*中,它可以完美地运行,但在java中

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

字符串保持不变。

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

您无法更改字符串,而是replaceAll返回新值。所以你应该像这样使用它

String newStr = s.replace(...)

答案 3 :(得分:0)

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

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