2020-07-30 19:49发布
一个字符串就是一个正则表达。
如字符串"\D"在Java中表示非数字([^0-9]),而Java代码里字符串中的'\'符号需要转义,所以要表示这个正则表达式需要用"\\D"。
Java中和正则表达式相关的主要有两个类:
importjava.util.regex.Pattern;
importjava.util.regex.Matcher;
Pattern类表示的是某种匹配模式。一个Pattern对象和一个正则表达式相关联,而不表示具体的匹配。
Patternpattern=Pattern.compile("[a-z]\\d{3}.*");
Matcher类表示的是具体的匹配。一个Matcher对象和一个具体的字符串相关联,表示在指定模式下的这个字符串的匹配。
Matchermatcher=pattern.matcher("hello123world");
具体的匹配信息都在Matcher对象中,所以多个Matcher对象可以共享一个Pattern对象。
查看给定的字符串是否完全匹配指定模式:
System.out.println(matcher.matches());//true
//下面的代码完全等价,这是一个简便方法
System.out.println(Pattern.matches("[a-z]+\\d{3}.*","hello123world"));//true
看代码示例:
publicclassTest{
publicstaticvoidmain(String[]args){
Stringstr="汽车鲁A12345、京A98765、辽B55555超速";
Stringpattern="(\\D{2})(\\d+)";
Patternr=Pattern.compile(pattern);
Matcherm=r.matcher(str);
//给出的整个字符串str是否符合正则表达式pattern
System.out.println(m.matches());//false
System.out.println("==========匹配查找");
while(m.find()){//从str开头查找符合正则表达式的子串,每次查找会从上一次找到的位置后继续往后查找
Stringprint=String.format("分组2出现的位置索引:%d,分组2内容<%s>",m.start(2),m.group(2));
System.out.println(print);
}
System.out.println("==========重置匹配器,重置查找位置");
m.reset();//重置匹配器,下一次不指定索引的查找从str头开始。此句可以省略,看下面注释
intindex=10;
while(m.find(index)){//从指定索引开始查找。由于指定了索引,之前的m.reset()对执行结果没影响,可以省略
Stringprint=String.format("此次匹配,分组数:%d,匹配的子串为<%s>,分组1内容<%s>,分组2内容<%s>",
m.groupCount(),m.group(0),m.group(1),m.group(2));
index=m.end();
System.out.println("==========重置匹配器,重置输入序列");
m.reset("鲁B99999");//重置匹配器的输入序列
while(m.find()){
程序输出:
false
==========匹配查找
分组2出现的位置索引:4,分组2内容<12345>
分组2出现的位置索引:12,分组2内容<98765>
分组2出现的位置索引:20,分组2内容<55555>
==========重置匹配器,重置查找位置
此次匹配,分组数:2,匹配的子串为<京A98765>,分组1内容<京A>,分组2内容<98765>
此次匹配,分组数:2,匹配的子串为<辽B55555>,分组1内容<辽B>,分组2内容<55555>
==========重置匹配器,重置输入序列
分组2出现的位置索引:2,分组2内容<99999>
最多设置5个标签!
一个字符串就是一个正则表达。
如字符串"\D"在Java中表示非数字([^0-9]),而Java代码里字符串中的'\'符号需要转义,所以要表示这个正则表达式需要用"\\D"。
Java中和正则表达式相关的主要有两个类:
importjava.util.regex.Pattern;
importjava.util.regex.Matcher;
Pattern类表示的是某种匹配模式。一个Pattern对象和一个正则表达式相关联,而不表示具体的匹配。
Patternpattern=Pattern.compile("[a-z]\\d{3}.*");
Matcher类表示的是具体的匹配。一个Matcher对象和一个具体的字符串相关联,表示在指定模式下的这个字符串的匹配。
Matchermatcher=pattern.matcher("hello123world");
具体的匹配信息都在Matcher对象中,所以多个Matcher对象可以共享一个Pattern对象。
查看给定的字符串是否完全匹配指定模式:
System.out.println(matcher.matches());//true
//下面的代码完全等价,这是一个简便方法
System.out.println(Pattern.matches("[a-z]+\\d{3}.*","hello123world"));//true
看代码示例:
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
publicclassTest{
publicstaticvoidmain(String[]args){
Stringstr="汽车鲁A12345、京A98765、辽B55555超速";
Stringpattern="(\\D{2})(\\d+)";
Patternr=Pattern.compile(pattern);
Matcherm=r.matcher(str);
//给出的整个字符串str是否符合正则表达式pattern
System.out.println(m.matches());//false
System.out.println("==========匹配查找");
while(m.find()){//从str开头查找符合正则表达式的子串,每次查找会从上一次找到的位置后继续往后查找
Stringprint=String.format("分组2出现的位置索引:%d,分组2内容<%s>",m.start(2),m.group(2));
System.out.println(print);
}
System.out.println("==========重置匹配器,重置查找位置");
m.reset();//重置匹配器,下一次不指定索引的查找从str头开始。此句可以省略,看下面注释
intindex=10;
while(m.find(index)){//从指定索引开始查找。由于指定了索引,之前的m.reset()对执行结果没影响,可以省略
Stringprint=String.format("此次匹配,分组数:%d,匹配的子串为<%s>,分组1内容<%s>,分组2内容<%s>",
m.groupCount(),m.group(0),m.group(1),m.group(2));
System.out.println(print);
index=m.end();
}
System.out.println("==========重置匹配器,重置输入序列");
m.reset("鲁B99999");//重置匹配器的输入序列
while(m.find()){
Stringprint=String.format("分组2出现的位置索引:%d,分组2内容<%s>",m.start(2),m.group(2));
System.out.println(print);
}
}
}
程序输出:
false
==========匹配查找
分组2出现的位置索引:4,分组2内容<12345>
分组2出现的位置索引:12,分组2内容<98765>
分组2出现的位置索引:20,分组2内容<55555>
==========重置匹配器,重置查找位置
此次匹配,分组数:2,匹配的子串为<京A98765>,分组1内容<京A>,分组2内容<98765>
此次匹配,分组数:2,匹配的子串为<辽B55555>,分组1内容<辽B>,分组2内容<55555>
==========重置匹配器,重置输入序列
分组2出现的位置索引:2,分组2内容<99999>
一周热门 更多>