正则表达式常见应用功能
用途:1、匹配(校验)
使用的是String类的matches方法
boolean matches(String regex);
需求:校验手机号码
根据常识,我们知道手机号码应该是11位的,全数字,
第一位是1,第二位有3、4、5、7、8等数字,后面的位上的数字是0~9任意数字
所以我们可以根据常识再遵循正则表达式要满足的规则,来写正则表达式。
代码:
public class RegexDemo_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String tel="18800001111";
String regex="1[34578][0-9]{9}";
//\d也表示0~9之间任意数,使用时要注意要把前面的斜杠转译。和上句代码表示一个意思。
// String regex="1[34578]\\d{9}";
boolean b=tel.matches(regex);
System.out.println(tel+":"+b);
}
}
运行结果为:
18800001111:true
用途:2、切割
使用的是String类的split方法
String[] split(String regex);
组:捕获组可以通过从左到右计算其开括号来编号。
例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
示例:
public class RegexDemo_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// demo1();//简单切割
// demo2_1();//想只取出名字,失败
// demo2_2();//想只取出名字,成功
// demo3_1();//特殊的. 想只取出名字,失败
// demo3_2();//特殊的. 想只取出名字,成功
demo4();//将叠词切除。
}
public static void demo1() {
// TODO Auto-generated method stub
String s="xiaoming zhangsan wanger";//三个名字,名字与名字之间有一个空格
String[] names=s.split(" ");
System.out.println(names.length);
for(String name : names){
System.out.println(name);
}
}
public static void demo2_1() {
// TODO Auto-generated method stub
String s="xiaoming zhangsan wanger";//三个名字,名字与名字之间有空格,前面3个空格,后面1个空格
String[] names=s.split(" ");
System.out.println(names.length);
for(String name : names){
System.out.println(name);
}
System.out.println(names[2].equals(""));//true 表示这个角标的元素是"",不是空格
System.out.println(names[2].equals(" "));//false 表示不是空格
}
public static void demo2_2() {
// TODO Auto-generated method stub
String s="xiaoming zhangsan wanger";//三个名字,名字与名字之间有空格,前面3个空格,后面1个空格
String[] names=s.split(" +");//+表示一次或多次
System.out.println(names.length);
for(String name : names){
System.out.println(name);
}
}
public static void demo3_1() {
// TODO Auto-generated method stub
String s="xiaoming.zhangsan.wanger";
String[] names=s.split(".");
System.out.println(names.length);//0 因为在正则表达式规则里.是个特殊符号,代表的是任意字符,所以整个字符串都被切除了。
for(String name : names){
System.out.println(name);
}
}
public static void demo3_2() {
// TODO Auto-generated method stub
String s="xiaoming.zhangsan.wanger";
String[] names=s.split("\\.");//由于.是个特殊符号,所以要想切割掉字符.就需要对它进行转译。
System.out.println(names.length);
for(String name : names){
System.out.println(name);
}
}
public static void demo4() {
// TODO Auto-generated method stub
String s="xiaomingtttttzhangsanmmmwanger";//
String[] names=s.split("(.)\\1+");//叠词封装成一组进行切割
System.out.println(names.length);
for(String name : names){
System.out.println(name);
}
}
}
从上到下方法单独运行结果如下:
3
xiaoming
zhangsan
wanger
----------------------------5
xiaoming
zhangsan
wanger
true
false
----------------------------
3
xiaoming
zhangsan
wanger
----------------------------0
----------------------------
3
xiaoming
zhangsan
wanger
----------------------------
3
xiaoming
zhangsan
wanger
用途:3、替换
使用的是String类的replaceAll方法
根据正则表达式在字符串里面匹配出符合规则的子串,
然后用字符串replacement替换掉这些子串,返回替换后的一个新字符串。
StringreplaceAll(String regex,String replacement);
示例:
public class RegexDemo_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
demo1();//将叠词替换成#
demo2();//将叠词替换成对应单个字母
demo3();//将手机号码的中间四位替换成四个*
}
public static void demo1() {
// TODO Auto-generated method stub
String s="xiaomingtttttzhangsanmmmwanger";
String result=s.replaceAll("(.)\\1+", "#");
System.out.println(result);
}
public static void demo2() {
// TODO Auto-generated method stub
String s="xiaomingtttttzhangsanmmmwanger";
String result=s.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
public static void demo3() {
// TODO Auto-generated method stub
String s="15800001111";
//将字符串按3个数、4个数、4个数这样匹配成3组,其中第二组用****代替
String result=s.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$3");
System.out.println(result);
}
}<strong>
</strong>
运行结果如下
xiaoming#zhangsan#wanger
xiaomingtzhangsanmwanger
158****1111
用途:4、获取
需要使用到Pattern类和Matcher类
Pattern类:正则类
没有构造方法,需要使用静态方法获取对象
static Pattern compile(Stringregex);
常用方法:
Matcher matcher(String s);
Matcher类:匹配器类
没有构造方法,需要通过Pattern类的matcher方法获取此类对象
常用方法:
相当于使用substring方法取匹配子串时里面的beginIndex,
注意使用此方法前,必须先使用find方法找到匹配子串才行,
否则会报IllegalStateException异常。
是要找到,没找到不行,也会报前面的异常。而且针对的是前面最后一个find方法执行的结果。
int start();
intend();相当于使用substring方法取匹配子串时里面的endIndex,注意事项与start的一样。
查找与正则表达式相匹配的子串,找到了就返回true,没找到就返回false。
记住,此方法每调用一次只查找一个,下次调用是从前一次找到的位置后面开始查找。
boolean find();
返回的是前面find方法最后一次调用所找到的子串,
注意,使用此方法时,前面一定要使用find方法先查找,而且还要查找到子串才行,
否则会报IllegalStateException异常。
String group();
Matcher类的对象要通过Pattern类获取,对字符串的操作要通过Matcher类的方法完成,
所以两个类要一起使用才能实现通过正则表达式来操作字符串的目的。
范例:
将正则表达式封装成正则类的对象
Patternp = Pattern.compile("ab");
通过正则对象的matcher方法和字符串相关联,获取要对字符串操作的匹配器对象Matcher。
Matcherm = p.matcher("aaaaab");
匹配器对象使用方法操作字符串
booleanb = m.matches();
示例:
/*
* 需求:取出字符串中三个字母组成的单词。
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="da jia hao,ming tian bu fang jia!";
demo1(s);//匹配器类的group方法使用时,前面一定要先使用find方法查找
// demo2(s);//匹配器find方法的查找方式
// demo3(s);//在regex里加上单词边界符,这样就不会把长单词给截取了。匹配器的start方法和end方法演示。
}
public static void demo1(String s) {
String regex="[a-z]{3}";
//将正则表达式封装成正则对象
Pattern p=Pattern.compile(regex);
//通过正则对象获取匹配器对象,记住要传入要被匹配器进行操作的字符串哦
Matcher m=p.matcher(s);
//匹配器对象调用find方法和group方法获取匹配正则表达式的子串。
m.find();//这次找到的应该是子串"jia"
m.find();//这次找到的应该是子串"hao"
String result=m.group();
m.find();//这次找到的应该是子串"min"
System.out.println(result);//hao 说明group返回的是前面最后一次find方法调用所匹配到的子串。
}
public static void demo2(String s) {
// TODO Auto-generated method stub
String regex="[a-z]{3}";
//将正则表达式封装成正则对象
Pattern p=Pattern.compile(regex);
//通过正则对象获取匹配器对象,记住要传入要被匹配器进行操作的字符串哦
Matcher m=p.matcher(s);
//匹配器对象调用find方法和group方法获取匹配正则表达式的子串。
System.out.println(s);
while(m.find()){
String result=m.group();
System.out.println(result);
}
}
public static void demo3(String s) {
// TODO Auto-generated method stub
String regex="\\b[a-z]{3}\\b";//\b是单词边界符
//将正则表达式封装成正则对象
Pattern p=Pattern.compile(regex);
//通过正则对象获取匹配器对象,记住要传入要被匹配器进行操作的字符串哦
Matcher m=p.matcher(s);
//匹配器对象调用find方法和group方法获取匹配正则表达式的子串。
System.out.println(s);
while(m.find()){
String result=m.group();
int start=m.start();//相当于使用substring方法取此子串result时里面的beginIndex
int end=m.end();//相当于使用substring方法取此子串result时里面的endIndex
System.out.println(result);
System.out.println(start+":"+end);
}
}
}
单独运行方法demo2和demo3的结果如下
demo1之所以没列是因为已经在代码里写出来了,也是单独运行的结果。
da jia hao,ming tian bu fang jia!
jia
hao
min
tia
fan
jia
------------------------------------------da jia hao,ming tian bu fang jia!
jia
3:6
hao
7:10
jia
29:32