java正则 环视_正则表达式之环视(java)

这段代码中真正匹配到的字符串是”ld”,所谓的顺序环视就是在匹配这个字符串前的那个位置。

5e01cd883f15286b5879f27150d59ae8.png

相信大家现在应该能够推测出逆序环视了吧。匹配的是ld后面那个位置。

环视的例子

理解了上诉环视的列子我们来解决一开始那个问题。我们可以先分析一下,需要满足这样的条件。左边要是数字,右边的数字个数是3的倍数。

接下来就是对这个条件所实现的java代码。

String str = "12345678";

Pattern pattern= Pattern.compile("(?<=\\d)(?=(\\d{3})+$)");

Matcher matcher=pattern.matcher(str);

System.out.printf(matcher.replaceAll(","));

(?<=\\d)这个表达式满足了左边是数字,可以想象一下。因为逆序环视是匹配字符串右边的位置,也就是\d右边的位置。那不就是说明了这个位置的左边是\d吗。对(?=(\\d{3})+$)的理解可能有点不太容易。如果是孤立的(\\d{3})+$匹配的是从字符串末尾向左数字的个数正好是3的倍数。但是加入顺序环视之后意义就不一样了它能匹配右边数字的个数正好是3的倍数的位置。$是关键,没有了这个符号,也就意味着可以不是从最后一个数字开始匹配的。这里可以结合程序好好的想想。这样两个条件就都满足了。也就能够匹配到正确的位置了。

但是如果给的字符串不一定是纯数字,可能是”12345678$”这样的形式,上诉的正则就不管用了。在这里我再引入两个概念就是否定顺序环视(?!)和否定逆序环视(?

在(?=表达式)中,意味表达式能够匹配右侧的文本,而(?!表达式)则以为表达式不能匹配右侧的文本。那么可以将正则改成

"(?<=\\d)(?=(\\d{3})+(?!\\d))"也许你认为可以将(?!\\d)改成\D,但是这两个其实是有区别的,\D是匹配一个非数字的字符,也就是说必须匹配一个字符。如果给你的数字是"12345678"这样就不能得到匹配了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值