带有 `\R` 的 Java-8 正则表达式否定回顾

标签 java regex java-8 regex-lookarounds

同时 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/

相关文章:

regex - gsub 没有替换 R 中的所有预期匹配项

java - 将 for 循环转换为 java8 风格

java - 返回两个可选值的总和,如果至少有一个不存在,则返回 null

java - 正则表达式查询 MongoDB 性能问题

javascript - 将函数重构为对象方法

java - 如何从其他类方法访问 ConcurrentHashMap 元素

javascript - ((?:[^\"])*) and ([^\"]*) 之间的正则表达式差异

java - 使用 SunEC 提供商的generateKeyPair 时出现运行时异常

java - 随机函数无法按我的意愿工作

Java 8 重复一段代码 x 次的方法