前面咱们讲太重复限定符,其实这些限定符就是贪婪量词,好比表达式:\d{3,6}正则表达式
用来匹配3到6位数字,在这种状况下,它是一种贪婪模式匹配,也就是假如字符串里有6个数字匹配,那它就会所有匹配到。spa
String test = "61762828 176 2991 871"; String reg = "\\d{3,6}"; Pattern pattern = Pattern.compile(reg); Matcher mc = pattern.matcher(test); while (mc.find()) { System.out.println("匹配结果:" + mc.group()); } // 匹配结果:617628 // 匹配结果:176 // 匹配结果:2991 // 匹配结果:871
由结果可见:原本字符串中的“61762828”这一段,其实只须要出现“617”就已经匹配成功了,但它并不知足,而是匹配到了最大能匹配的字符,也就是6个。code
那么有人会问,若是多个贪婪量词凑在一块儿,那他们是如何支配本身的匹配权的呢?blog
是这样的,多个贪婪在一块儿时,若是字符串能知足他们各自最大程度的匹配时,就互不干扰,但若是不能知足时,会根据深度优先的原则,也就是从左到右的每个贪婪量词,优先最大数量的知足,剩余再分配下一个量词匹配。字符串
String test = "61762828 176 2991 87321"; String reg = "(\\d{1,2})(\\d{3,4})"; Pattern pattern = Pattern.compile(reg); Matcher mc = pattern.matcher(test); while (mc.find()) { System.out.println("匹配结果:" + mc.group()); } // 匹配结果:617628 // 匹配结果:2991 // 匹配结果:87321
“617628” 是前面的\d{1,2}匹配出了61,后面的匹配出了7628table
"2991" 是前面的\d{1,2}匹配出了29 ,后面的匹配出了91class
"87321"是前面的\d{1,2}匹配出了87,后面的匹配出了321test
懒惰匹配:当正则表达式中包含能接受重复的限定符时,一般的行为是匹配尽量少的字符,这种匹配方式叫作懒惰匹配。特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,不然读入一个字符再匹配,依次循环(读入字符,匹配)直到匹配成功或者把字符串的字符匹配完为止。循环
代码 | 说明 |
*? | 重复任意次,但尽量少重复 |
+? | 重复1次或更屡次,但尽量少重复 |
?? | 重复0次或1次,但尽量少重复 |
{n,m}? | 重复n到m次,但尽量少重复 |
{n,}? | 重复n次以上,但尽量少重复 |
String reg = "(\\d{1,2}?)(\\d{3,4})"; String test = "61762828 176 2991 87321"; System.out.println("文本:" + test); System.out.println("贪婪模式:" + reg); Pattern p1 = Pattern.compile(reg); Matcher m1 = p1.matcher(test); while (m1.find()) { System.out.println("匹配结果:" + m1.group(0)); } // 文本:61762828 176 2991 87321 // 贪婪模式:(\d{1,2}?)(\d{3,4}) // 匹配结果:61762 // 匹配结果:2991 // 匹配结果:87321
“61762” 是左边的懒惰匹配出6,右边的贪婪匹配出1762
"2991" 是左边的懒惰匹配出2,右边的贪婪匹配出991
"87321" 左边的懒惰匹配出8,右边的贪婪匹配出7321数据