JAVA正则表达式的三种模式:贪婪,勉强和占有的讨论
假设待处理的字符串是 xfooxxxxxxfoo
模式.*foo (贪婪模式):
模式分为⼦模式p1(.*)和⼦模式p2(foo)两个部分. 其中p1中的量词匹配⽅式使⽤默认⽅式(贪婪型)。
匹配开始时,吃⼊所有字符xfooxxxxxx去匹配⼦模式p1。匹配成功,但这样以来就没有了字符串去匹配⼦模式p2。本轮匹配失败;第⼆轮:减少p1部分的匹配量,吐出最后⼀个字符, 把字符串分割成xfooxxxxxxfo和o两个⼦字符串s1和s2。 s1匹配p1, 但s2不匹配p2。本轮匹配失败;第三轮,再次减少p1部分匹配量,吐出两个字符, 字符串被分割成xfooxxxxxxfo和oo两部分。结果同上。第四轮,再次减少p1匹配量, 字符串分割成xfooxxxxxx和foo两个部分, 这次s1/s2分别和p1/p2匹配。停⽌尝试,返回匹配成功。
模式.*?foo (勉强模式): 最⼩匹配⽅式。
第⼀次尝试匹配, p1由于是0或任意次,因此被忽略,⽤字符串去匹配p2,失败;第⼆次,读⼊第⼀个字符x, 尝试和p1匹配, 匹配成功; 字符串剩余部分fooxxxxxxfoo中前三个字符和p2也是匹配的. 因此, 停⽌尝试, 返回匹配成功。在这种模式下,如果对剩余字符串继续去寻和模式相匹配的⼦字符串,还会到字符串末尾的另⼀个xfoo,⽽在贪婪模式下,由于第⼀次匹配成功的⼦串就已经是所有字符,因此不存在第⼆个匹配⼦串。
模式.*+foo (侵占模式): 也叫占⽤模式。
匹配开始时读⼊所有字符串, 和p1匹配成功, 但没有剩余字符串去和p2匹配。因此, 匹配失败。返回。
简单地说, 贪婪模式和占有模式相⽐, 贪婪模式会在只有部分匹配成功的条件下, 依次从多到少减少匹配成功部分模式的匹配数量, 将字符留给模式其他部分去匹配; ⽽占⽤模式则是占有所有能匹配成功部分, 绝不留给其他部分使⽤。
再看下⾯⼀个例⼦:贪婪模式与侵占模式的⽐较
正则:\w+[a-z]与\w++[a-z]
⽬标串:232hjdhfd7474$
分析:①\w+[a-z]:\w+属于贪婪模式,会⼀次性吃掉它所能吃掉的所有的字符,也就是⼦串232hjdhfd7474,此时[a-z]不能够到匹配了,故\w+匹配的串会吐出⼀个字符4,但此时还是得不到匹配。反复的这样吐出回退,直到吐出字符d时,此时[a-z]能够匹配h,所以这时正则表达式会返回⼀次成功的匹配结果,为232hjdhfd
正则匹配所有字符串②\w++[a-z]:\w++属于侵占模式,它会⼀次性吃掉它所能够吃掉的所有字符,即⼦串232hjdhfd7474,⽽且不留给其他部分使⽤,故不会回退。此时[a-z]不能够到匹配,所以此次匹配失败。在余下的⼦串中也不到能匹配成功的⼦串。所以整个正则表达式是不到匹配结果的!
量 词 种 类
意 义
贪婪勉强侵占
X?X??X?+匹配 X 零次或⼀次
X*X*?X*+匹配 X 零次或多次
X+X+?X++匹配 X ⼀次或多次
X{n}X{n}?X{n}+匹配 X n 次(这个应该不存在这⼏种模式,就是固定匹配n个)
X{n,}X{n,}?X{n,}+匹配 X ⾄少 n 次
X{n,m}X{n,m}?X{n,m}+匹配 X ⾄少 n 次,但不多于 m 次
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论