我获取用户输入,包括非ASCII字符和不可打印字符,例如
\xc2d
\xa0
\xe7
\xc3\ufffdd
\xc3\ufffdd
\xc2\xa0
\xc3\xa7
\xa0\xa0
例如:
email : abc@gmail.com\xa0\xa0
street : 123 Main St.\xc2\xa0
期望输出:
email : abc@gmail.com
street : 123 Main St.
使用Java删除它们的最佳方法是什么?
我尝试了以下方法,但似乎不起作用
public static void main(String args[]) throws UnsupportedEncodingException {
String s = "abc@gmail\\xe9.com";
String email = "abc@gmail.com\\xa0\\xa0";
System.out.println(s.replaceAll("\\P{Print}", ""));
System.out.println(email.replaceAll("\\P{Print}", ""));
}
输出
abc@gmail\xe9.com
abc@gmail.com\xa0\xa0
7条答案
按热度按时间kzipqqlq1#
你的要求不明确。Java
String
中的所有字符都是Unicode字符,因此如果删除它们,将留下空字符串。我假设你的意思是你想删除任何非ASCII,不可打印的字符。在这里,
\p{Print}
表示可打印ASCII字符的POSIX字符类,而\P{Print}
是该类的补充。使用此表达式,所有 * 不可 * 打印的ASCII字符都将替换为空字符串。(额外的反斜杠是因为\
以字符串文字开始转义序列。)显然,所有输入字符实际上都是ASCII字符,它们表示不可打印或非ASCII字符的可打印编码。Mongo在使用这些字符串时应该不会有任何问题,因为它们只包含普通的可打印ASCII字符。
这一切听起来有点可疑。我相信正在发生的是,数据确实包含不可打印和非ASCII字符,而另一个组件(如日志框架)正在用可打印的表示来替换这些字符。在您的简单测试中,您无法将可打印表示转换回原始字符串,因此您错误地认为第一个正则表达式不起作用。
这是我的猜测,但如果我误解了情况,而您确实需要去掉文字
\xHH
转义,则可以使用以下正则表达式。Pattern
类的API文档很好地列出了Java正则表达式库支持的所有语法。要详细说明所有语法的含义,我发现Regular-Expressions.info site非常有用。wf82jlnq2#
我知道这可能有点晚,但为了将来的参考:
删除所有不可打印的字符,但包括
\n
(换行符)、\t
(制表符)和\r
(回车符),有时您希望保留这些字符。对于这个问题,使用反向逻辑:
ttisahbt3#
使用Google Guava的
CharMatcher
,你可以删除任何不可打印的字符,然后保留所有ASCII字符(删除任何重音),如下所示:不确定这是否是您真正想要的,但它删除了您的问题示例数据中表示为转义序列的任何内容。
hi3rlvi24#
你可以试试这个代码:
我可以从
String
中删除无效字符。nkhmeac65#
你可以使用Java。text.normalizer
58wvjzkj6#
Input =〉“This\u7279text\u7279is what I need”Output =〉“This text is what I need”
如果你试图从一个字符串中删除Unicode字符,就像上面的代码一样
iih3973s7#
这个简单的功能对我来说更好: