java - 编译带有字符类和单词边界的详细 Java 正则表达式时出错

标签 java regex verbose

为什么这个模式编译失败:

Pattern.compile("(?x)[ ]\\b");

错误

ERROR java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 8
(?x)[ ]\b
        ^
at java_util_regex_Pattern$compile.call (Unknown Source)

虽然以下等效方法有效?

Pattern.compile("(?x)\\ \\b");
Pattern.compile("[ ]\\b");
Pattern.compile(" \\b");

这是 Java 正则表达式编译器中的错误,还是我遗漏了什么?我喜欢在详细的正则表达式中使用 [ ] 而不是反斜杠-反斜杠-空格,因为它可以节省一些视觉噪音。但显然它们并不相同!

PS:这个问题与反斜杠无关。这是关于使用包含单个空格 [ ] 而不是使用反斜杠的字符类来转义详细正则表达式中的空格。

详细的正则表达式 (?x) 和包含单个空格 [ ] 的字符类的组合以某种方式使编译器关闭并使其无法识别单词边界转义\b


使用 Java 测试,最高 1.8.0_151

最佳答案

I like to use [ ] in verbose regex instead of backslash-backslash-space because it saves some visual noise. But apparently they are not the same!

"[ ]""\\" 甚至 "" 相同。

问题是 (?x) 一开始就启用了评论模式。作为documentation状态

Permits whitespace and comments in pattern.
In this mode, whitespace is ignored, and embedded comments starting with # are ignored until the end of a line.
Comments mode can also be enabled via the embedded flag expression (?x).

在注释模式下,正则表达式 "(?x)[ ]\\b""[]\\b" 相同并且不会编译,因为空字符类 [] 不被解析为空,而是像 "[\\]" (包含文字 ] 的未封闭字符类)。

请改用 "\\b"。或者,通过使用反斜杠将其转义来保留注释模式中的空格:"(?x)[\\]\\b""(?x)\\\\b".

关于java - 编译带有字符类和单词边界的详细 Java 正则表达式时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264034/

相关文章:

java - Android BroadcastReceiver 不工作(包括错误)

java - 如何使用 commons Digester 解析 xml 文件并让它填充 java.util.Date 对象?

java - .xsl 文件不会通过浏览器从 tomcat7 下载

ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符

javascript - 带有 XCode 的正则表达式 Javascript

java - 此数据的格式名称是什么?

java - 使用字符串的 Pattern.compile()

mysql - 防止从 mysqldump 中取消详细输出

powershell - 捕获详细流而不启用 -Verbose

java - 在java中打开/关闭println的任何方法(详细模式)