从String中删除非ASCII不可打印字符

day*_*mer 16 java non-ascii-characters

我得到用户输入,包括非ASCII字符和不可打印的字符,例如

\xc2d
\xa0
\xe7
\xc3\ufffdd
\xc3\ufffdd
\xc2\xa0
\xc3\xa7
\xa0\xa0
Run Code Online (Sandbox Code Playgroud)

例如:

email : abc@gmail.com\xa0\xa0
street : 123 Main St.\xc2\xa0
Run Code Online (Sandbox Code Playgroud)

期望的输出:

  email : abc@gmail.com
  street : 123 Main St.
Run Code Online (Sandbox Code Playgroud)

使用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}", ""));
    }
Run Code Online (Sandbox Code Playgroud)

产量

abc@gmail\xe9.com
abc@gmail.com\xa0\xa0
Run Code Online (Sandbox Code Playgroud)

eri*_*son 45

您的要求不明确.Java String中的所有字符都是Unicode字符,因此如果删除它们,则会留下空字符串.我假设您的意思是要删除任何非ASCII,不可打印的字符.

String clean = str.replaceAll("\\P{Print}", "");
Run Code Online (Sandbox Code Playgroud)

这里,\p{Print} 表示可打印ASCII字符的POSIX字符类,而\P{Print}该类是该类的补充.使用此表达式,所有不可打印ASCII的字符都将替换为空字符串.(额外的反斜杠是因为\在字符串文字中启动转义序列.)


显然,所有输入字符实际上都是ASCII字符,表示不可打印或非ASCII字符的可打印编码.Mongo应该对这些字符串没有任何问题,因为它们只包含普通的可打印ASCII字符.

这对我来说听起来有点可疑.我认为发生的事情是数据确实包含非可打印和非ASCII字符,而另一个组件(如日志框架)正在用可打印的表示替换它们.在您的简单测试中,您无法将可打印表示转换回原始字符串,因此您错误地认为第一个正则表达式不起作用.

这是我的猜测,但是如果我误读了这种情况并且您确实需要删除文字\xHH转义,则可以使用以下正则表达式来完成.

String clean = str.replaceAll("\\\\x\\p{XDigit}{2}", "");
Run Code Online (Sandbox Code Playgroud)

Pattern该类的API文档很好地列出了Java的正则表达式库支持的所有语法.为了更详细地说明所有语法的含义,我发现Regular-Expressions.info网站非常有用.


Phi*_*art 15

随着谷歌番石榴CharMatcher,你可以删除任何非打印字符,然后保留所有ASCII字符(将任何口音)是这样的:

String printable = CharMatcher.INVISIBLE.removeFrom(input);
String clean = CharMatcher.ASCII.retainFrom(printable);
Run Code Online (Sandbox Code Playgroud)

不确定这是否是您真正想要的,但它会删除问题的示例数据中表示为转义序列的任何内容.

  • 注意,INVISIBLE删除了我发现奇怪的空格,因为它确实是"可打印的" (4认同)

Iva*_*vić 10

我知道这可能会晚,但为了将来的参考:

String clean = str.replaceAll("\\P{Print}", "");
Run Code Online (Sandbox Code Playgroud)

删除所有不可打印的字符,但包括\n(换行符),\t(制表符)和\r(回车),有时您希望保留这些字符.

对于那个问题,使用倒置逻辑:

String clean = str.replaceAll("[^\\n\\r\\t\\p{Print}]", "");
Run Code Online (Sandbox Code Playgroud)

  • 得到错误:非法转义字符String clean = str.replaceAll("[^ \n\r\t\t\p {Print}]",""); .\ p应该是\ P (2认同)