不会正则表达式?看这篇就够了( 四 )

输出结果:
aabbbbddddii嗯,这就是我们想要的了 。
 
在举个替换的例子,假如想要把字符串中abc换成a 。
String test = "abcbbabcbcgbddesddfiid";String reg="(a)(b)c";System.out.println(test.replaceAll(reg, "$1"));输出结果:
abbabcgbddesddfiid4、贪婪和非贪婪
 
贪婪
 
我们都知道,贪婪就是不满足,尽可能多的要 。
 
在正则中,贪婪也是差不多的意思:
 
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配 。
特性:一次性读入整个字符串进行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃(这种匹配-舍弃的方式也叫做回溯),直到匹配成功或者把整个字符串舍弃完为止,因此它是一种最大化的数据返回,能多不会少 。
前面我们讲过重复限定符,其实这些限定符就是贪婪量词,比如表达式:d{3,6} 。
用来匹配3到6位数字,在这种情况下,它是一种贪婪模式的匹配,也就是假如字符串里有6个个数字可以匹配,那它就是全部匹配到 。
 
如下面的代码 。
String reg="d{3,6}";String test="61762828 176 2991 871";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 44 871贪婪模式:d{3,6}匹配结果:617628匹配结果:176匹配结果:2991匹配结果:871由结果可见:本来字符串中的“61762828”这一段,其实只需要出现3个(617)就已经匹配成功了的,但是他并不满足,而是匹配到了最大能匹配的字符,也就是6个 。
 
一个量词就如此贪婪了,
 
那有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的呢?
 
是这样的,多个贪婪在一起时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰,但如果不能满足时,会根据深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配 。
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})匹配结果:617628匹配结果:2991匹配结果:87321“617628” 是前面的d{1,2}匹配出了61,后面的匹配出了7628
"2991" 是前面的d{1,2}匹配出了29 ,后面的匹配出了91
"87321"是前面的d{1,2}匹配出了87,后面的匹配出了321
懒惰(非贪婪)
 
懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配 。
特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依此循环(读入字符、匹配)直到匹配成功或者把字符串的字符匹配完为止 。
懒惰量词是在贪婪量词后面加个“?”
 
代码说明*?重复任意次,但尽可能少重复+?重复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
5、反义
 
前面说到元字符的都是要匹配什么什么,当然如果你想反着来,不想匹配某些字符,正则也提供了一些常用的反义元字符 。


推荐阅读