同时 answering another question ,我写了一个正则表达式来匹配所有空格,最多包括一个换行符。我对 \R
换行符匹配器使用负后视来做到这一点:
((?<!\R)\s)*
后来我在想,我说,哦不,如果有一个\r\n
呢?它肯定会捕获第一个换行字符 \r
然后我会在我的下一个字符串的前面被一个虚假的 \n
卡住,对吧?
所以我回去测试(并可能修复)它。但是,当我测试该模式时,它匹配了整个 \r\n
。它不只匹配 \r
离开 \n
正如人们可能期望的那样。
"\r\n".matches("((?<!\\R)\\s)*"); // true, expected false
但是,当我使用 documentation 中提到的“等效”模式时对于 \R
,它返回 false。那么这是 Java 的一个错误,还是它匹配的正当理由?
最佳答案
构造 \R
是一个宏,它将子表达式包围在一个原子组 (?> parts )
中。
这就是为什么它不会将它们分开。
注意:如果 Java 接受 lookbehind 中的固定交替,使用 \R
是可以的,但如果引擎不接受,这将引发异常。
关于带有 `\R` 的 Java-8 正则表达式否定回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42474596/