正则表达式(Regex)
符合某种规则的字符串.(一种规则,有自己特殊的规则.)
最多用途:数据的校验.
匹配功能(掌握)
使用String类中的matches方法
字符
1) X 字符X
2) \\ 反斜线
3) \r 回车
4)\n 换行
字符类
1) [abc] a,b或者c 一次一个
2) [^abc] 非abc,除了a,b,c
3) [a-zA-z] a-z或者A-Z,两头的字母包含在内(范围)
4) [0-9] 0-9的字符
预定义字符类
1) . 任何字符
2) \\d 数字[0-9]
3) \\D 非数字
4) \\s 空白字符
5) \\S 非空白字符
6) \\w 单词字符:[a-zA-Z_0-9]
单词字符:在\\w里面包含的内容都是单词字符.
7) \\W 非单词字符
边界匹配器
1) ^ 行开头
2) $ 行结尾 ^[a-z]{3}$
3) \\b 单词边界(这个地方不能是单词)
\b[a-z]{3}\b匹配三个字符的字母
只要长度和字符都满足,不加边界默认全部识别
[abc]默认匹配一次
数量词
X 一次或一次也没有[a-z]?
X* 零次或多次[a-z]*
X+ 一次或者多次[a-z]+
X{n} 恰好n次[a-z]{3}
X{n,} 至少一次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
//------------------需求校验手机号码格式------------------
//定义控制台输入
Scanner sc = new Scanner(System.in);
//提示信息
System.out.print("请输入:");
//接收控制台输入
String str = sc.nextLine();
//定义正则表达式
String regex = "1[35]\\d{9}";
//判断是否符合规则
boolean flag = str.matches(regex);
//打印判断结果
System.out.println("flag:"+flag);
//------------------需求:校验邮箱格式实例------------------
//封装控制台输入
Scanner sc = new Scanner(System.in);
//提示信息
System.out.print("请输入:");
//字符串接收输入信息
String str = sc.nextLine();
//定义正则表达式
String regex = "\\w+@\\w+(\\.\\w+)+";
//判断是否有符合规则,并返回boolean值
boolean flag = str.matches(regex);
//输出判断结果
System.out.println("flag:"+flag);
切割功能
public String[] split(String str)
基本切割:
//------------------需求:取出空格,.\\符号------------------
//定义字符串
String str = "aa ,,.. \\bb ,,.. \\cc";
//定义正则表达式
String regex = " +,+\\.+ +\\\\";
//切割后使用字符串数组接收
String[] flag = str.split(regex);
//增强for循环遍历数组
for (String s:flag){
System.out.print(s);
}
叠词切割
同一个字符出现2次以上就被称为叠词
叠词规则:
1) 左边的字符和右边一致并出现1次以上
2) 通过编号获取,编号从1开始
3) 编号必须添加反斜线转义字符\\
//------------------需求:切割重复的单词------------------
//定义字符串
String str = "adsssnfejjjjjadw";
//定义正则表达式
String regex = "(.)\\1+";
//切割处理,字符串数组接收
String[] flag = str.split(regex);
//遍历数组
for(String s:flag){
System.out.print(s);
}
替换功能
使用String类中的replaceAll方法
//------------------需求:替换字符串中叠词为#------------------
//定义字符串
String str = "asd1111sdddfwf8888mshhhdsa";
//定义正则表达式
String regex = "(.)\\1+";
//replaceAll方法替换匹配规则的字符串
String s = str.replaceAll(regex, "#");
区别:
(.)\\1+: 表示叠词的切割.
(.)\\1+ , $1:表示右边引用左边组中的第一组内容.
//------------------需求:删除多余的字符串,保留一位,如asddewrre,替换为asdewre------
//定义字符串
String str = "asd1111sdddfwf8888mshhhdsa";
//定义正则表达式
String regex = "(.)\\1+";
//replaceAll方法替换匹配规则的字符串,保留一位
String s = str.replaceAll(regex, "$1");
需求:替换字符串中的字符为*
//创建字符串
String str = "asdqwe123124435dsadsadsa";
//定义正则表达式
String regex = "\\d";
//替换数字为*
String s = str.replaceAll(regex, "*");
获取功能
使用的是正则对象Pattern和匹配器
模式对象,也就是把正则表达式进行编译生成的一个对象
Pattern p = Pattern.compile("a*b");
调用模式对象的matcher方法,返回一个Matcher对象,匹配器对象
这个时候匹配器对象由模式对象接受实际数据产生的
Matcher m =p.Matcher("aaa");
调用匹配器对象的判断方法matches(),返回boolean类型
Boolean b =m.matches();
Matcher方法:
boolean find():查找有没有和模式匹配的字符串.
String group():返回查找到的字符串.
//------------------需求:获取3个字母的单词------------------
//创建字符串
String str = "ming tian fang jia ,dan shi yao shang ke";
//定义正则表达式
String regex = "\\b\\w{3}\\b";
//把正则表达式编译生成一个编译模式
Pattern pat = Pattern.compile(regex);
//根据模式和实际的参数生成一个匹配器对象
Matcher mat = pat.matcher(str);
//调用匹配器对象的功能判断有没有和模式匹配的字符串
while(mat.find()){
//group()返回匹配的字符串
System.out.println(mat.group());
}