我正在解析一些XML并清理一些字段。
我试图在Java中执行以下操作:
nameField = nameField.replaceAll("[^a-zA-Z\\d\\s\\.,'&]", "");
我不想要替换字母表中的任何字母,任何数字,任何空格,任何句号,任何逗号,任何单引号或(这是我的问题所在)文字字符串 &
。
但我确实想要替换单个&
或单;
但显然我的正则表达式无法正常工作。它会留在所有&
和所有;
。
例如,如果找到K&W@#9$9(AR;.0 O&
的字符串,我的预期结果将为:KW99AR.0 O&
。
我怎样才能做到这一点?
答案 0 :(得分:2)
为什么不简化你的正则表达式,只是采取前瞻/后视:
// |"&" not followed by "amp;"
// | | or
// | | ";" not preceded by "&"
nameField.replaceAll("&(?!amp;)|(?<!&);", "");
"K&W@#9$9(AR;.0 O&"
的输出为:
KW@#9$9(AR.0 O&
修改强>
然后,你可以用清理链接它,只留下你想要的字符。在此,我将;
和&
添加到排除列表中,因为他们已经在#34; standalone&#34;通过以前的操作。
此外,您不需要在自定义字符类中转义点。
.replaceAll("[^a-zA-Z\\d\\s.,;&]", "");
两个链式调用将返回:
KW99AR.0 O&
备注强>
>
,<
等。答案 1 :(得分:1)
我认为应该这样做:
nameField = nameField.replaceAll("[^\\w&\\.\\s';,]","")
.replaceAll("&","%")
.replaceAll("[&;]","")
.replaceAll("%","&");