通过正则表达式删除所有非打印字符

pet*_*ust 6 java regex unicode

我的文件包含非打印字符,例如\u2066-\u2069(方向格式)和\u2000-\u2009(各种宽度的空间,例如 )。是否可以使用(Java)正则表达式删除(或替换)它们?(\\s+不适用于上述情况)。我不想自己构建它,因为我不知道我会得到什么样的角色。

Wik*_*żew 3

您提供的所有字符都属于分隔符、空格Unicode 类别,因此,您可以使用

s = s.replaceAll("\\p{Zs}+", " ");
Run Code Online (Sandbox Code Playgroud)

UnicodeZs类别代表任何类型的空格分隔符(请参阅文档中的更多类别名称)。

要将所有水平空格替换为单个常规 ASCII 空格,您可以使用

s = s.replaceAll("\\h+", " ");
Run Code Online (Sandbox Code Playgroud)

根据Java 正则表达式文档

\h     水平空白字符:[ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

如果要将所有 Unicode 空格缩小为单个空格

s = s.replaceAll("(?U)\\s+", " ");
Run Code Online (Sandbox Code Playgroud)

(?U)是一个嵌入式标志选项,等于Pattern.UNICODE_CHARACTER_CLASS传递给该Pattern.compile方法的选项。没有它,\s匹配\p{Space}匹配的内容,即[ \t\n\x0B\f\r]. 一旦你传递了(?U),它将开始匹配 Unicode 表中的所有空白字符。

要标记字符串,您可以直接拆分

String[] tokens = s.split("\\p{Zs}+");
String[] tokens = s.split("\\h+");
String[] tokens = s.split("(?U)\\s+");
Run Code Online (Sandbox Code Playgroud)