我一直在读到以下模式在 Java 中用作
String#replaceAll()
的一部分
"[\\p{Cntrl}&&[^\r\n\t]]"
从中删除各种不可打印的 ASCII 字符。
如何解释上述咒语:
&&
代表什么?^
是否意味着它只查看行的开头?有人可以对上述表达式提供全面的非技术解释吗?
提前谢谢您。
这里发生的一些事情仅在某些正则表达式中可用。您可能会在 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
的示例。因此,您的正则表达式会匹配
[\x00-\x1F\x7F]
范围内的每个字符,但字符 [\r\n\t]
除外。
该模式匹配控制字符集
\\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-"