捕获分组的注意事项:
l
只要使用了括号,就存在捕获分组
l
捕获分组按照开括号出现的从左到右的顺序编号,遇到括号嵌套的情况也是如此
l
如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串
例子:
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
public
class
GeneralSix {
public
static
void
main(String[] args) {
String email =
"abacdemasterhappy@163.com"
;
String regex =
"((\\w+)@([\\d\\.\\w]+))"
;
Pattern p = Pattern.
compile
(regex);
Matcher m = p.matcher(email);
if
(m.find()){
System.
out
.println(
"匹配结果:\t"
+ m.group(0));
System.
out
.println(
"分组1:\t"
+ m.group(1));
System.
out
.println(
"分组2:\t"
+ m.group(2));
System.
out
.println(
"分组3:\t"
+ m.group(3));
}
}
}
运行结果:
匹配结果:
abacdemasterhappy@163.com
分组1:
abacdemasterhappy@163.com
分组2:
abacdemasterhappy
分组3:
163.com
String regex =
"((\\w+)@([\\d\\.\\w]+))"
;
只是在正则表达式的两端添加了一个( ),此时出现括号嵌套的情况。
依照括号从左到右的顺序,发现,第一个括号对应整个正则表达式,第二个对应用户名正则表达式,第三个括号用于匹配主机名的正则表达式。
再看一个:
public
class
GeneralSeven {
public
static
void
main(String[] args) {
String email =
"abacdemasterhappy@163.com"
;
String regex =
"(\\w)+@([\\d\\.\\w])+"
;
Pattern p = Pattern.
compile
(regex);
Matcher m = p.matcher(email);
if
(m.find()){
System.
out
.println(
"匹配结果:\t"
+ m.group(0));
System.
out
.println(
"分组1:\t"
+ m.group(1));
System.
out
.println(
"分组2:\t"
+ m.group(2));
System.
out
.println(
"分组3:\t"
+ m.group(3));
}
}
}
运行结果:
匹配结果:
abacdemasterhappy@163.com
分组1:
y
分组2:
m
将量词作用整个捕获分组。匹配完成之后,捕获分组所保存的就是最后一次它所匹配的文本。
abacdemasterhapp
y
@163.co
m
相当于匹配用户名的最后一个字符。
捕获分组的事项讲解到此!
不捕获文本的括号
l
如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率
l
作用:仅仅用来对表达式分组,而不把分组捕获的文本存入结果
l
形式:
·
(?:...)
注意:
不捕获文本的括号,并不是所有语言都有提供,为了增加可读性,并不推荐使用“不捕获文本的括号”。
例子:
public
class
GeneralEight {
public
static
void
main(String[] args) {
String email =
"abacdemasterhappy@163.com"
;
String regex =
"(?:abacdemasterhappy|admin)@(163.com)"
;
Pattern p = Pattern.
compile
(regex);
Matcher m = p.matcher(email);
if
(m.find()){
System.
out
.println(
"匹配结果:\t"
+ m.group(0));
System.
out
.println(
"分组1:\t"
+ m.group(1));
}
}
}
运行结果:
匹配结果:
abacdemasterhappy@163.com
分组1:
163.com
括号的用途:反向引用
l
作用:在表达式的某一部分,
动态重复
之前子表达式所匹配的文本
l
形式:
\1
例子:
public
class
GeneralNine {
public
static
void
main(String[] args) {
String[] strs =
new
String[] {
"<h1>good,good</h1>"
,
"<h1>bad</h2>"
};
String regex =
"<\\w+>[^<]+</\\w+>"
;
for
(String string : strs) {
if
(
regexMatch
(string,regex)){
System.
out
.println(string +
"能够匹配正则:"
+ regex);
}
else
{
System.
out
.println(string +
"不能够匹配正则:"
+ regex);
}
}
}
private
static
boolean
regexMatch(String s, String regex) {
return
s.matches(regex);
}
}
运行结果:
<h1>good,good</h1>能够匹配正则:<\w+>[^<]+</\w+>
<h1>bad</h2>能够匹配正则:<\w+>[^<]+</\w+>
未完待续。。。
本文转自jooben 51CTO博客,原文链接:http://blog.51cto.com/jooben/317569