当前位置: 首页 > 面试题库 >

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

吕修筠
2023-03-14
问题内容

我得到的用户输入包括非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

问题答案:

您的要求不清楚。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网站非常有帮助。



 类似资料:
  • 问题内容: 从网站提取数据时出现奇怪的字符: 如何删除不是非扩展ASCII字符的内容? 问题答案: 正则表达式替换将是最佳选择。使用作为一个例子的字符串,并使用匹配它,这是一个POSIX字符类: 什么是寻找所有可打印字符。相反,查找所有不可打印的字符。不属于当前字符集的所有字符都将被删除。 注意: 使用此方法之前,必须确保当前字符集为ASCII。POSIX字符类同时支持ASCII和Unicode,

  • 问题内容: 我有一个包含非ASCII字符的URI,例如: http://www.abc.de/qq/qq.ww?MIval=typo3_bsl_int_Smtliste&p_smtbez=Schmalbl -ttrigeSomerzischeruchtanb 如何从此URI中删除“ …” 问题答案: 我猜想URL的来源更多是错误的。也许您正在解决错误的问题?从URI中删除“奇怪”字符可能会赋予它完

  • 问题内容: 我有一个存储在数据库中的HTML字符串。不幸的是,它包含诸如®的字符,我想在数据库本身中或在我的Python / Django代码中使用“查找替换”将它们替换为HTML等效字符。 关于如何执行此操作的任何建议? 问题答案: 你可以使用ASCII字符为前128个字符,因此获取每个字符的编号,如果超出范围则将其删除 结果 请注意,@其中包括了它,因为毕竟它是一个ASCII字符。如果要剥离特

  • 我想我需要删除字符0-31和127。 是否有一个函数或一段代码来高效地做到这一点?

  • #include <stdio.h> #include <wchar.h> int main(void) { char str1[] = "abcd"; wchar_t str2[] = L"abcd"; return 0; } 技巧 用gdb调试程序时,可以使用“x/s”命令打印ASCII字符串。以上面程序为例: Temporary brea

  • 问题内容: 我已经尝试解决这个问题一段时间了,我试图从DB_user列中删除非ASCII字符并尝试将它们替换为空格。但是我不断出错。这是我的数据框的外观: 我正在使用此功能,这是我在研究SO问题时遇到的。 我不断收到错误: 但是,我认为通过使用filter_func函数中的循环,可以通过在’ord’中输入一个char来解决这个问题。因此,当它遇到非ASCII字符时,应将其替换为空格。 有人可以帮我