我正在尝试匹配 \^c 形式的控制字符,其中 c 是控制字符的任何有效字符。我有这个正则表达式,但目前不起作用:
\\[^][@-z]
我认为问题在于插入符(^)是正则表达式解析引擎的一部分。
使用模式
^X
匹配 \^.
形式的 ASCII 文本字符串,仅此而已。将 \^X
形式的 ASCII 文本字符串与模式 \\\^.
进行匹配。您可能希望将该点限制为 [?@_\[\]^\\]
,即 \\\^[A-Z?@_\[\]^\\]
。对于括号内的字符类,读作 [?\x40-\x5F]
更容易,因此 \\\^[?\x40-\x5F]
表示文字反斜杠,后跟文字 CIRCUMFLEX,然后是变成有效控制字符之一的内容。
请注意,这是打印出图案的结果,或者是您从文件中读取的结果。这是您需要传递给正则表达式编译器的内容。如果您将其作为字符串文字,那么您当然必须将每个反斜杠加倍。
`\\\\\\^[?\\x40-\\x5F]"
是的,这看起来很疯狂,但那是因为 Java 不像 Groovy 和 Scala(或者 Perl 和 Ruby)那样直接支持正则表达式。正则表达式工作总是更容易,无需额外的 bbaacckksslllllaasshheesssssess。 :)
如果您有真正的控制字符而不是它们的间接表示,则可以使用
\pC
表示具有 GC=Other 属性的所有文字代码点,或使用 \p{Cc}
表示 GC=Control。
检查一下:https://www.regular-expressions.info/nonprint.html。你应该能够使用