Java正则表达式中的贪婪型、勉强型和占有性

温馨提示,不熟悉Java正则表达式的不建议读该文章。等你熟悉正则表达式之后,这篇文章会给你如虎添翼的感觉!


我们来先看一个例子:

在Java中有一个字符串:

xfooxxxxxxfoo

分别使用正则表达式".*foo"、".*?foo"和".*+foo"去匹配这个字符串,分别会匹配到什么?

如果你不知道,或者对结果不太确定,那么建议你把这边文章看完。

贪婪型、勉强型和占有型


量词匹配(正则表达式匹配)的贪婪型、勉强型和占有型:贪婪型属于正常的表示(平时写的那些),勉强型则在后面加个“问号”,占有型加个“加号”,都只作用于前面的问号、星号、加号、大括号,因为前面如果没有这些,就变成普通的问号和加号了(也就是变成贪婪型了)。


贪婪型

贪婪型的匹配原理,一个一个匹配,先一直匹配到最后,发现最后的字符不匹配时,往前退一格再匹配,不匹配时再退一格,递归;


来看看我们文章前面给出的例子,".*foo"就是典型的贪婪型正则表达式。".*foo"能匹配上字符串“xfooxxxxxxfoo”的整个字符串。


见下图红框部分:

勉强型

勉强型是匹配到一个字符后看看匹配能否结束,能结束就结束;


来看看我们文章前面给出的例子,".*?foo"就是典型的贪婪型正则表达式。这个表达式的".*?"会一个一个字符往后尝试匹配,能匹配上就匹配,匹配不上就停止。因此,".*?foo"能匹配到字符串“xfooxxxxxxfoo”最前面的四个字符“xfoo”。


见下图红框部分:

占有型

占有型(完全匹配)是从第一个匹配开始,把后面所有字符串读入来匹配,一直匹配到最后,如果最后的字符不匹配的话,那么也不回退,返回false结束。如,



这个例子的正则表达式是占有型,所以在寻找匹配时失败。在这种情况下,整个输入的字符串被.*+消耗了,什么都没有剩下来满足表达式末尾的“foo”。因此匹配不上。


跟小编一起来精通Java吧!

举报
评论 0