注意两个字眼:“内容” 和 “使用”。
这里所说的“内容”,是匹配结果,而不是子表达式原本,强调这个有哪些用?嗯,先记住。
那这里所说的“使用”是如何使用呢?
因为它的用处主要是拿来查找一些重复的内容以及做更换指定字符。
还是举栗子吧。
比如要查找一串字母”aabbbbgbddesddfiid”里成对的字母
如果根据我们之前学到的正则,什么区间啊限定啊断言啊可能是办不到的,

现在我们先用程序思维理一下思路:
1)匹配到一个字母
2)匹配第下一个字母,检查能否和上一个字母是否一样
3)如果一样,则匹配成功,否则失败
这里的模式2中匹配下一个字母时,需要用到上一个字母,那如何记住上一个字母呢???
这下子捕获就有意义啦,我们可以运用捕获把上一个匹配成功的内容用来成为本次匹配的条件
好了,有模式还要实践
首先匹配一个字母:w
我们必须变成分组才能捕获,因此写成这种:(w)
那这个表达式就有一个捕获组:(w)
然后我们要用这个捕获组成为条件,那就可以:(w)
这样就大功告成了
可能有人不明白了,是哪个意思呢?
还记得捕获组有两种命名方法吗,一种是是按照捕获分组顺序命名,一种是自定义命名来成为捕获组的命名
在默认情况下都是以数字来命名,而且数字命名的排序是从1开始的
因此要引用第一个捕获组,根据反向引用的数字命名规则 就必须 k以及
当然,通常都是是前者。
我们来测试一下:
1
2
3
4
5
6
7
String test = "aabbbbgbddesddfiid";
Pattern pattern = Pattern.compile("(\w)\1");
Matcher mc= pattern.matcher(test);
while(mc.find())
{
System.out.println(mc.group());
}
输出结果:
1
aabbbbddddii
嗯,这就是我们想要的了。
在举个替换的事例,假如想要把字符串中abc换成a。
1
2
3
String test = "abcbbabcbcgbddesddfiid";
String reg="(a)(b)c";
System.out.println(test.replaceAll(reg, "$1"));
输出结果:
1
abbabcgbddesddfiid
我们都明白,贪婪就是不满足,尽可能多的应。
在正则中,贪婪也是差不多的意思:
贪婪匹配:当正则表达式中包括可接受重复的限定符时,通常的行为是(在让整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配模式叫做贪婪匹配。
特性:一次性读入整个字符串进行匹配,每当不匹配就放弃更后面一个字符,继续匹配,依次匹配和放弃(这种匹配-舍弃的方法也叫做回溯),直到匹配成功以及把整个字符串舍弃完为止,因此它是一种最大化的数据返回,能多不会少。
前面我们讲过重复限定符,其实这种限定符就是贪婪量词,比如表达式:d{3,6}。
用来匹配3至6位数字,在这些状况下,它是一种贪婪模式的匹配,也就是假如字符串里有6个个数字可以匹配,那它就是全部匹配到。
如以下的代码。
1
2
3
4
5
6
7
8
9
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));
}
输出结果:

1
2
3
4
5
6
文本:61762828 176 2991 44 871
贪婪模式:d{3,6}
匹配结果:617628
匹配结果:176
匹配结果:2991
匹配结果:871
由结果可见:本来字符串中的“61762828”这一段,其实只应该发生3个(617)就即将匹配成功了的,但是他并不满足,而是匹配到了最大能匹配的字符,也就是6个。
一个量词就这么贪婪了,
那有人会问,如果多个贪婪量词凑在一起,那你们是怎样支配自己的匹配权的呢?
是这种的,多个贪婪在一起时,如果字符串能满足人们各自最大程度的匹配时,就互不干扰,但即便不能满足时,会按照深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配。
1
2
3
4
5
6
7
8
9
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));
}
输出结果:
1
2
3
4
5
文本:61762828 176 2991 87321
贪婪模式:(d{1,2})(d{3,4})
匹配结果:617628
匹配结果:2991
匹配结果:87321
“617628” 是上面的d{1,2}匹配出了61,后面的匹配出了7628
“2991” 是中间的d{1,2}匹配出了29java 正则表达式 版本号,后面的匹配出了91
“87321”是上面的d{1,2}匹配出了87,后面的匹配出了321
懒惰匹配:当正则表达式中包括可接受重复的限定符时,通常的行为是(在让整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配模式叫做懒惰匹配。
特性:从左至右,从字符串的更前面开始匹配,每次试图不读取数组匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依此循环(读入字符、匹配)直到匹配成功以及把字符串的数组匹配完为止。
懒惰量词是在贪婪量词后面加个“?”
代码说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复。
1
2
3
4
5
6
7
8
9
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));
}
输出结果:
1
2
3
4
5
文本:61762828 176 2991 87321
贪婪模式:(d{1,2}?)(d{3,4})
匹配结果:61762
匹配结果:2991
匹配结果:87321
“61762” 是上面的聪明匹配出6,右边的贪婪匹配出1762
“2991” 是上面的聪明匹配出2,右边的贪婪匹配出991
“87321” 左边的懒惰匹配出8,右边的贪婪匹配出7321
前面说到元字符的都是要匹配哪些什么,当然即使你想反着来,不想匹配这些字符,正则也提供了一些常用的反义元字符。
元字符解释:
W匹配任意不是字母,数字,下划线,汉字的字符
S匹配任意不是空白符的数组
D匹配任意非数字的字符
B匹配不是单词开头或结束的位置
[x]匹配除了x以外的任意字符
[aeiou]匹配除了aeiou这几个字母以外的任意字符
正则进阶知识就提到这里,正则是一门博大精深的语言,其实学会它的一些词汇跟知识点还算不太难,但想要做到真正学以致用能说出非常6的正则,还有很远的距离,只有真正对它感兴趣的,并且一直研究跟使用它,才会逐渐的理解它的博大精深之处,我就带他们跑到这,剩下的,靠自己啦。
参考资料
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-135746-2.html
怎么想出这注意的
快回归