正则表达式的贪婪型、勉强型、占有型 -- 《JAVA编程思想》40

在学习正则表达式的过程中,了解到正则表达式默认拥有三种匹配模式,在书中和网上未找到简单明了的解释,故此记录分享。

贪婪型:JAVA 中正则表达式默认匹配模式,此模式下会尽可能多的去匹配字符串,当一段字符串满足条件后,会继续向后匹配,直到不满足条件为止。若最后一次匹配不满足,则会向前回溯寻找上一次满足条件的字符串。

勉强型:在表达式后加上 ? 号来指定此模式,此模式会按照所需的最少字符来进行匹配。

占有型:此模式为 JAVA 中正则表达式的独有模式(在其他语言中不可用),通过在表达式后加上 + 号来执行此模式。此模式与贪婪型类似,也是尽可能多的匹配字符串,但它不会进行回溯,常常用于防止正则表达式失控。

下面我们通过一个例子来直观感受一下:

public class StringMatch {

    public static void main(String[] args) {
        String str = "abcgabcgabcd";
        //贪婪型
        System.out.println(str.replaceAll("ab.*g","***"));
        //勉强型
        System.out.println(str.replaceAll("ab.*?g","***"));
        //占有型
        System.out.println(str.replaceAll("ab.*+g","***"));
    }
    
}
***abcd
******abcd
abcgabcgabcd

上述例子为用正则表达式匹配:字母 ab 开头,中间有零或多个字符,最后以字母 g 结尾的字符,再将它们替换成 “***”。

贪婪型:ab.*g
尽可能匹配满足条件的字符串,第一次发现 abcg 满足 ab.*g 后,继续往后匹配至 “abcgabcg” ,发现仍满足需求,继续匹配字符串至"abcgabcgabcd",发现不满足需求,返回上一次满足需求的结果,故最终替换的字符串为 “abcgabcg”,最终输出的结果为 :***abcd 。

勉强型:ab.*?g
当发现 “abcg” 满足 ab.*g 后立刻停止匹配,字符串 “abcgabcgabcd” 有两个 “abcg” 满足条件,故替换2次,最后输出的结果为:******abcd 。

占有型:ab.*+g
类似于贪婪型,第一次发现 “abcg” 满足 ab.*g 后,继续往后匹配至 “abcgabcg” ,发现仍满足需求,继续匹配字符串至 “abcgabcgabcd” ,发现正则表达式不成立,又因占有型无回溯功能,正则表达式校验失败,最终不会替换任何字符,输出原字符:abcgabcgabcd 。

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值