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

hgtggwj0  于 2023-04-28  发布在  Java
关注(0)|答案(7)|浏览(233)

我获取用户输入,包括非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
kzipqqlq

kzipqqlq1#

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

String clean = str.replaceAll("\\P{Print}", "");

在这里,\p{Print}表示可打印ASCII字符的POSIX字符类,而\P{Print}是该类的补充。使用此表达式,所有 * 不可 * 打印的ASCII字符都将替换为空字符串。(额外的反斜杠是因为\以字符串文字开始转义序列。)
显然,所有输入字符实际上都是ASCII字符,它们表示不可打印或非ASCII字符的可打印编码。Mongo在使用这些字符串时应该不会有任何问题,因为它们只包含普通的可打印ASCII字符。
这一切听起来有点可疑。我相信正在发生的是,数据确实包含不可打印和非ASCII字符,而另一个组件(如日志框架)正在用可打印的表示来替换这些字符。在您的简单测试中,您无法将可打印表示转换回原始字符串,因此您错误地认为第一个正则表达式不起作用。
这是我的猜测,但如果我误解了情况,而您确实需要去掉文字\xHH转义,则可以使用以下正则表达式。

String clean = str.replaceAll("\\\\x\\p{XDigit}{2}", "");

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

wf82jlnq

wf82jlnq2#

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

String clean = str.replaceAll("\\P{Print}", "");

删除所有不可打印的字符,但包括\n(换行符)、\t(制表符)和\r(回车符),有时您希望保留这些字符。
对于这个问题,使用反向逻辑:

String clean = str.replaceAll("[^\\n\\r\\t\\p{Print}]", "");
ttisahbt

ttisahbt3#

使用Google GuavaCharMatcher,你可以删除任何不可打印的字符,然后保留所有ASCII字符(删除任何重音),如下所示:

String printable = CharMatcher.INVISIBLE.removeFrom(input);
String clean = CharMatcher.ASCII.retainFrom(printable);

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

hi3rlvi2

hi3rlvi24#

你可以试试这个代码:

public String cleanInvalidCharacters(String in) {
    StringBuilder out = new StringBuilder();
    char current;
    if (in == null || ("".equals(in))) {
        return "";
    }
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9)
                || (current == 0xA)
                || (current == 0xD)
                || ((current >= 0x20) && (current <= 0xD7FF))
                || ((current >= 0xE000) && (current <= 0xFFFD))
                || ((current >= 0x10000) && (current <= 0x10FFFF))) {
            out.append(current);
        }

    }
    return out.toString().replaceAll("\\s", " ");
}

我可以从String中删除无效字符。

nkhmeac6

nkhmeac65#

你可以使用Java。text.normalizer

58wvjzkj

58wvjzkj6#

Input =〉“This\u7279text\u7279is what I need”Output =〉“This text is what I need
如果你试图从一个字符串中删除Unicode字符,就像上面的代码一样

Pattern unicodeCharsPattern = Pattern.compile("\\\\u(\\p{XDigit}{4})");
Matcher unicodeMatcher = unicodeChars.matcher(data);
String cleanData = null;
if (unicodeMatcher.find()) {
    cleanData = unicodeMatcher.replaceAll("");
}
iih3973s

iih3973s7#

这个简单的功能对我来说更好:

function remove_non_ascii(str) {
  
    if ((str===null) || (str===''))
         return false;
   else
     str = str.toString();
    
    return str.replace(/[^\x20-\x7E]/g, '');
}

相关问题