如果想要正则匹配 name=wangna age=20 ,并提取出 wangna,20这两个值,就可以写表达式,把要提取的内容写在()里的子表达式里,使用matcher.group() 进行提取。
public class ThreadTest {
public static void main(String[] args) {
String reg ="name=(.+)\s+age=(.+)";
Pattern pat = Pattern.compile(reg);
String msg= "name=wangna age=20";
if (msg != null && pat != null) {
//使用写好的pat 匹配 待匹配的字符串
Matcher matcher = pat.matcher(msg);
//如果待匹配的字符串中,有可以匹配此pat的 字符串
if (matcher.find()) {
//matcher.groupCount() 代表匹配到的子表到式的个数+1,1代表matcher.group(0)匹配到的整个字符串
for (int i = 0; i <= matcher.groupCount(); i++) {
//得到第0组 是匹配到的整个表达式,第一组是匹配到的第一个子表达式的内容,依此类推。
System.out.println("Group :"+matcher.group(i));
}
}
}
String str = "Hello,World!";
Pattern pattern = Pattern.compile("W(or)(ld!)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println("Group 0:"+matcher.group(0));//得到第0组——整个匹配
System.out.println("Group 1:"+matcher.group(1));//得到第一组匹配——与(or)匹配的
System.out.println("Group 2:"+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式
System.out.println("Start 0:"+matcher.start(0)+" End 0:"+matcher.end(0));//总匹配的索引
System.out.println("Start 1:"+matcher.start(1)+" End 1:"+matcher.end(1));//第一组匹配的索引
System.out.println("Start 2:"+matcher.start(2)+" End 2:"+matcher.end(2));//第二组匹配的索引
System.out.println(str.substring(matcher.start(0),matcher.end(1)));//从总匹配开始索引到第1组匹配的结束索引之间子串——Wor
}
}
}
打印输出结果:
Group :name=wangna age=20
Group :wangna
Group :20
Group 0:World!
Group 1:or
Group 2:ld!
Start 0:6 End 0:12
Start 1:7 End 1:9
Start 2:9 End 2:12
Wor
正则表达式书写样例:
<01> wangna: oct 31 09:05:00 msg: name=wangna age=20
private static String reg ="^<([0-9]+)>\s+([A-Za-z]+):\s+([A-Za-z]+\s+\d{2}\s+\d{2}:\d{2}:\d{2})\s+([A-Za-z]+):(.*)";
private static Pattern pat = Pattern.compile(reg);
这个表达式可以把 01 , wangna ,Mar 31 09:05:00 , msgbody, id=3547328872 name=wangna age=20 这几个字符串提取出来。
可以验证正则表达式的网站:
http://www.matools.com/map
对特殊符号转义的时候,在上面的网站上使用一个就可以,但在java里需要两个\。