在学习正则表达式的过程中,了解到正则表达式默认拥有三种匹配模式,在书中和网上未找到简单明了的解释,故此记录分享。
贪婪型: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 。
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!