您的位置:首页 > 编程语言 > Java开发

Java中的正则表达式中Greedy,Reluctant和Possessive数量词的区别

2016-01-31 15:40 645 查看
在Java深入学习的过程中,我在阅读JDK1.6的API时,在Pattern类的构造器摘要中发现了匹配数量词有三种模式,分别是Greedy,Reluctant和Possessive

JDK1.6的中文版API对它们的说明分别如下:

Greedy 数量词
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n 次
X{n,}X,至少 n 次
X{n,m}X,至少 n 次,但是不超过 m 次
正则表达式中,默认情况下基本上都是使用Greedy数量词

例如字符串"qwert12345",可以匹配它的正则表达式为".*5".其中"."可以匹配任何字符,"*"表示匹配0次或多次,程序在编译运行时,"qwert12345"字符串本身可以被".*"匹配,但是后边多了个"5"无法匹配,因此回溯一个字符,正好匹配了"5",所以返回true.

Reluctant 数量词
X??X,一次或一次也没有
X*?X,零次或多次
X+?X,一次或多次
X{n}?X,恰好 n 次
X{n,}?X,至少 n 次
X{n,m}?X,至少 n 次,但是不超过 m 次
Reluctant数量词在匹配时,与Greedy的匹配模式是相反的,它从左到右一个一个进行匹配,而不是匹配字符串再进行回溯

例如字符串"qwert12345",".*?3"也是匹配的,因为从左到右一个一个看只有整个字符串才能匹配,儿对于正则表达式".+?"来说,职匹配最左边的字符q,如果正则表达式是".*?"则意味着没有匹配任何字符串.

Possessive 数量词
X?+X,一次或一次也没有
X*+X,零次或多次
X++X,一次或多次
X{n}+X,恰好 n 次
X{n,}+X,至少 n 次
X{n,m}+X,至少 n 次,但是不超过 m 次
Possessive数量词与Greedy数量词类似,也是匹配字符串.唯一的不同时Possessive不回溯,所以对于"qwert12345",".*+3"不匹配.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 正则表达式 api