我一直在读到以下模式在 Java 中用作
String#replaceAll()
的一部分
"[\\p{Cntrl}&&[^\r\n\t]]"
从中删除各种不可打印的 ASCII 字符。
如何解释上述咒语:
&&
代表什么?^
是否意味着它只查看行的开头?有人可以对上述表达式提供全面的非技术解释吗?
提前谢谢您。
这里发生的一些事情仅在某些正则表达式中可用。您可能会遇到不同语言的实施或可用性方面的差异。
在支持的情况下,您可以定义一个包含多个类的字符类。例如,
[[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
的示例。因此,您的正则表达式会匹配
[\x00-\x1F\x7F]
范围内的每个字符,但字符 [\r\n\t]
除外。
“...哪些字符包含在要删除的控制字符中?...”
您可以在 Pattern 类 JavaDoc 中找到此信息。
模式 – POSIX 字符类(仅限 US-ASCII) – (Java SE 20 和 JDK 20)。
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
即从值 0 到 1f,以及值 7f。
“...
代表什么?...”&&
&&
是字符类交集语法的一部分。
例如,以下内容将匹配任何字符,a到z,但x和y除外。
[a-z&&[^xy]]
“...
是否意味着它只查看行的开头?...”^
在字符类、
[ ]
内时不可以。
该模式匹配控制字符集
\\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-"