栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java-8正则表达式负数与 R落后

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java-8正则表达式负数与 R落后

实现#1。 该文档是错误的

来源:https
:
//docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

它说:

换行匹配器

…相当于

u000Du000A|[u000Au000Bu000Cu000Du0085u2028u2029]

但是,当我们尝试使用“等效”模式时,它将返回false:

String _R_ = "\R";System.out.println("rn".matches("((?<!"+_R_+")\s)*")); // true// using "equivalent" pattern_R_ = "\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]";System.out.println("rn".matches("((?<!"+_R_+")\s)*")); // false// now make it atomic, as per sln's answer_R_ = "(?>"+_R_+")";System.out.println("rn".matches("((?<!"+_R_+")\s)*")); // true

因此,Javadoc应该 真正 说:

…相当于

(?<!u000Du000A|[u000Au000Bu000Cu000Du0085u2028u2029])

根据Sherman在Oracle
JDK-8176029上
于2017年3月9日更新:

“ api doc没错,实现是错误的(当“ 0x0d + 0x0a + next.match()”失败时,它无法回溯“ 0x0d +
next.match()”)”


实现#2。 向后看不仅向后看

尽管有名称,但向后查找不仅可以向后看,而且可以包含甚至跳过当前位置。

考虑以下示例(来自rexegg.com):

"_12_".replaceAll("(?<=_(?=\d{2}_))\d+", "##"); // _##_

“这之所以有趣,有几个原因。首先,我们在回溯中有一个前瞻,即使我们应该向后看,该前瞻也会通过匹配两个数字和下划线来跳过当前位置。这是杂技。”

这对于我们的示例意味着什么

R
,即使我们当前的位置可能是
n
,也不会阻止后退者认识到其
r
后面是
n
,然后将两者绑定为一个原子团,因此拒绝识别其
r
背后的部分。当前位置作为单独的匹配项。

注意:为简单起见,我使用了诸如“我们的当前位置是

n
”之类的术语,但这并不是内部发生的事情的精确表示。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/617191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号