删除 ASCII 控制字符的正则表达式

问题描述 投票:0回答:2

我一直在读到以下模式在 Java 中用作

String#replaceAll()
的一部分

"[\\p{Cntrl}&&[^\r\n\t]]"

从中删除各种不可打印的 ASCII 字符。

如何解释上述咒语:

  • 哪些字符包含在要删除的控制字符中?
  • &&
    代表什么?
  • ^
    是否意味着它只查看行的开头?

有人可以对上述表达式提供全面的非技术解释吗?

提前谢谢您。

java regex replaceall
2个回答
0
投票

这里发生的一些事情仅在某些正则表达式中可用。您可能会在 Java 或 Ruby 中看到它们,但不会在 JavaScript 或 Perl 中看到它们。

在支持的情况下,您可以定义一个包含多个类的字符类。例如,

[[a-z][0-9]]
[a-z0-9]
的有效等价物。

在支持

&&
运算符的情况下,它可用于创建一个字符类,该字符类是两个字符类的交集。例如,
[[a-z]&&[^d-w]]
相当于
[abcxyz]

有很多 POSIX 字符类可以用

\p{category_name}
定义。类别
\p{Cntrl}
代表
[\x00-\x1F\x7F]
。您可以在 Java 文档中找到
java.util.regex.Pattern
的示例。
(参见:https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

因此,您的正则表达式会匹配

[\x00-\x1F\x7F]
范围内的每个字符,但字符
[\r\n\t]
除外。


0
投票

该模式匹配控制字符集

\\p{Cntrl}
与非换行符、回车符或制表符
&&
相交(通过
[^\r\n\t]
)的字符。示例:

"a\u0001b\u0002c\rd\te\nf".replaceAll("[\\p{Cntrl}&&[^\r\n\t]]","-");
=> control codes 0001 and 0002 are removed: "a-b-c\rd\te\nf"

为了帮助解释,请考虑将

\\p{Cntrl}
替换为
[a-z]
,将
[^\r\n\t]
替换为
[^aeiou]
,然后您将得到一个可用于过滤辅音的模式:

"123abcdef".replaceAll("[[a-z]&&[^aeiou]]","-");
=> "123a---e-"
© www.soinside.com 2019 - 2024. All rights reserved.