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

小编典典

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

来源:https

:

//docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

它说:

换行匹配器

…相当于 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

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

String _R_ = "\\R";

System.out.println("\r\n".matches("((?

// using "equivalent" pattern

_R_ = "\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]";

System.out.println("\r\n".matches("((?

// now make it atomic, as per sln's answer

_R_ = "(?>"+_R_+")";

System.out.println("\r\n".matches("((?

因此,Javadoc应该 真正 说:

…相当于 (?

根据Sherman在OracleJDK-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”之类的术语,但这并不是内部发生的事情的精确表示。

2020-11-13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值