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

在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"不匹配.

你可能感兴趣的:(JavaSE开发,学习笔记)