Java - 正则表达式全部替换不会替换匹配的文本

时间:2017-08-23 23:35:01

标签: java regex replaceall

尝试从字符串中删除大量unicodes但在java中遇到regex问题。

示例文字:

  

\ u2605 StatTrak \ u2122暗影匕首

示例所需结果:

  

StatTrak Shadow Daggers

我当前的正则表达式代码不起作用:

list.replaceAll("\\\\u[0-9]+","");

代码将执行但文本不会被替换。通过查看其他解决方案,人们似乎只使用了两个" \\"但是小于4的任何东西都会引发我典型的错误:

  

线程中的异常" main" java.util.regex.PatternSyntaxException:索引2附近的非法Unicode转义序列   \ U [0-9] +

我在RegexPlanetFreeFormatter等在线测试环境中尝试了当前的正则表达式解决方案,并且都给出了正确的结果。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

假设您想要替换"特殊字符串"清空String。我看到,\u2605\u2122POSIX个字符类。这就是为什么我们可以尝试将这些可打印字符替换为""。然后,结果与您的期望相同。

样本将是:

list = list.replaceAll("\\P{Print}", "");

希望得到这个帮助。

答案 1 :(得分:1)

在Java中,像\u2605这样的字符序列不是六个字符的字面序列,它代表一个unicode字符 - 因此你的模式"\\\\u[0-9]{4}"将不匹配。

您的模式描述了一个文字字符\,后跟字符u,后跟正好四个数字字符09,但字符串中的内容是 unicode代码点2605中的单个字符,即“黑星”字符。

这与其他转义序列一样:在字符串"some\tmore"中没有字符\且没有字符t ...只有单个字符0x09,a 制表符 - 因为它是Java(和其他语言)已知的转义序列,它被表示的字符和文字\ {{所取代。 1}}不再是字符串中的字符。

Kenny Tai Huynh的答案,取代非printables,可能是最简单的方法,取决于你想要删除的东西,或者你可以列出你想要的字符(如果这是一个非常有限的集合)并删除这些的补充,例如t

答案 2 :(得分:0)

我是个白痴。我在字符串上调用了replaceAll但没有分配它,因为我认为它无论如何都改变了字符串。

我以前的所作所为:

list.replaceAll("\\\\u[0-9]+","");

我需要的是什么:

list = list.replaceAll("\\\\u[0-9]+","");

现在结果正常,感谢您的帮助。