在Java中删除ASCII控制字符的正则表达式[关闭]

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

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

String#replaceAll()
的一部分

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

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

如何解释上述咒语:

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

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

提前谢谢您。

java regex replaceall
3个回答
3
投票

这里发生的一些事情仅在某些正则表达式中可用。您可能会遇到不同语言的实施或可用性方面的差异。

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

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

在支持

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

有一堆预定义的字符类可以通过

\p{category_name}
引用。在Java中,类别
\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]
除外。


2
投票

“...哪些字符包含在要删除的控制字符中?...”

您可以在 PatternJavaDoc 中找到此信息。

模式 – POSIX 字符类(仅限 US-ASCII) – (Java SE 20 和 JDK 20)

\p{Cntrl}    控制字符:[\x00-\x1F\x7F]

即从值 0 到 1f,以及值 7f

“...

&&
代表什么?...”

&&
字符类交集语法的一部分。

例如,以下内容将匹配任何字符,az,但xy除外。

[a-z&&[^xy]]

“...

^
是否意味着它只查看行的开头?...”

字符类

[ ]
内时不可以。


1
投票

该模式匹配控制字符集

\\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.