Java replaceAll不替换字符串

时间:2016-09-09 13:18:08

标签: java regex

我正在解析一些XML并清理一些字段。

我试图在Java中执行以下操作:

nameField = nameField.replaceAll("[^a-zA-Z\\d\\s\\.,'&]", "");

想要替换字母表中的任何字母,任何数字,任何空格,任何句号,任何逗号,任何单引号或(这是我的问题所在)文字字符串 &

但我确实想要替换单个&或单;

的出现次数

但显然我的正则表达式无法正常工作。它会留在所有&和所有;

例如,如果找到K&W@#9$9(AR;.0 O&的字符串,我的预期结果将为:KW99AR.0 O&

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

为什么不简化你的正则表达式,只是采取前瞻/后视:

//                  |"&" not followed by "amp;"
//                  |          | or
//                  |          | ";" not preceded by "&amp"
nameField.replaceAll("&(?!amp;)|(?<!&amp);", "");

"K&W@#9$9(AR;.0 O&amp;"的输出为:

KW@#9$9(AR.0 O&amp;

修改

然后,你可以用清理链接它,只留下你想要的字符。在此,我将;&添加到排除列表中,因为他们已经在#34; standalone&#34;通过以前的操作。

此外,您不需要在自定义字符类中转义点。

.replaceAll("[^a-zA-Z\\d\\s.,;&]", "");

两个链式调用将返回:

KW99AR.0 O&amp;

备注

  • 正如Tushar所提到的,自定义字符类中的字符序列不被视为序列,而是替代单个字符。
  • 一般经验法则:小心使用正则表达式来解析标记。你最终可能会陷入更大的混乱。正则表达式不用于解析标记或带语法的语言。
  • 您的具体案例足够安全,但请记住还有其他XML实体,例如&gt;&lt;等。

答案 1 :(得分:1)

我认为应该这样做:

nameField = nameField.replaceAll("[^\\w&\\.\\s';,]","")
           .replaceAll("&amp;","%")
           .replaceAll("[&;]","")
           .replaceAll("%","&amp;");