博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java正则表达式匹配模式[贪婪型、勉强型、占有型]
阅读量:4211 次
发布时间:2019-05-26

本文共 1269 字,大约阅读时间需要 4 分钟。

对于这三种匹配模式也有叫: “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。

1、Greediness(贪婪型): 最大匹配

X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也许你所期待的结果是想匹配“”,但是实际结果却会匹配到“<tr>aava </tr>”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。

①“<”匹配字符串的“<”。②“.+”匹配字符串的“<tr>aava </tr>ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b” ③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。

这就是最大匹配,我们匹配的时候应该看最后面能匹配到哪。

代码示例:String test = "aaava abb ";String reg = "<.+>";System.out.println(test.replaceAll(reg, "###"));输出:a###abb

2、Reluctant(Laziness)(勉强型):最小匹配

X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。

最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+? 再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和 Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。

代码示例:String test = "aaava abb ";String reg = "<.+?>";System.out.println(test.replaceAll(reg, "###"));输出:a###aava ###abb和上面的不同是匹配了两处。

3、Possessive(占有型):完全匹配

与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。

代码示例:String test = "aaava abb ";String test2 = "";String reg = "<.++>";String reg2 = "";System.out.println(test.replaceAll(reg, "###"));System.out.println(test2.replaceAll(reg2, "###"));输出:aaava abb###

可见。完全匹配是最严格的,必须整个字符串匹配才行。

转载地址:http://iegli.baihongyu.com/

你可能感兴趣的文章
yii2 - controller
查看>>
yii2 - 增加actions
查看>>
php图像处理函数大全(缩放、剪裁、缩放、翻转、旋转、透明、锐化的实例总结)
查看>>
magento url中 uenc 一坨编码 base64
查看>>
强大的jQuery焦点图无缝滚动走马灯特效插件cxScroll
查看>>
Yii2.0 数据库查询
查看>>
yii2 db 操作
查看>>
mongodb group 有条件的过滤组合个数。
查看>>
关于mongodb的 数组分组 array group
查看>>
MongoDB新的数据统计框架介绍
查看>>
mongodb 增加全文检索索引
查看>>
symfony
查看>>
softlayer 端口开放
查看>>
操作2:mongodb使用语法
查看>>
如何给分类增加一个属性(后台)
查看>>
linux设置环境变量 临时设置 和 永久设置
查看>>
mysql数据库主从同步的问题解决方法
查看>>
LoadRunner如何在脚本运行时修改log设置选项?
查看>>
QC数据库表结构
查看>>
自动化测试工具的3个关键部分
查看>>