为什么这个模式编译失败:
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/