正则表达式
一、基础语法
字符 | 匹配 | 具体用法 |
---|---|---|
. | 所有字符 | \\. 表示 |
\ | 转义符 | java中使用以下字符都要加上\ |
\d | 所有数字 | \\d |
\D | 非数字 [^0-9] | \\D |
[0-9] | 所有数字 作用同\d | |
[a-z] | 所有的小写字母 | |
[A-Z] | 所有大写字母 | |
\s | 一个空格 | \\s |
\w | 所有字母、数字、下划线,相当于 [a-zA-Z_0-9] | \\w |
\W | 非单词字符 [^\w] | \\W |
^ | 表示开头 | 注意:^[0-9] 和 [^0-9] 的区别 |
$ | 表示结尾 | |
[\u4e00-\u9fa5] | 匹配汉字 | |
? | 表示匹配的字符出现0或1次 | |
+ | 表示匹配的字符出现一次或多次 | |
* | 表示匹配的字符出现零次或多次 | |
{n} | 表示匹配的字符出现 n次 | |
{n,} | 表示匹配的字符出现至少n次 | |
{n,m} | 表示匹配的字符出现 至少n次,至多n次 | |
[ ] | 一个中括号代表一个字符 |
二、具体用法
1.匹配
public void test1(){
//使用场景:验证手机号:1. 长度11位 2.纯数字 3.第二位数字为[35789]
String phone = "15902693094";
String regex = "[1][35789][0-9]{9}";//写法1
String regex1 = "[1][35789]\\d{9}";//写法2
boolean flag = phone.matches(regex1);
System.out.println(flag ? "格式正确" : "格式错误");
//验证任意9位字符
String regex2 = ".{9}";
System.out.println("123abc789".matches(regex2));
//验证带.格式的字符
String regex3 = "\\d{3}\\.\\d{3}";
System.out.println("123.789".matches(regex3));
}
2.切割
public void test2(){
String str1 = "张三.李四.王五";
String[] arr1 = str1.split("\\.");//切割的时候正则符号都添加
for(String temp : arr1){
System.out.println(temp);
}
}
3.替换
public void test3(){
//使用场景:垂直电商评论
String discuss = "大家好,我家星幻摆台,买一送一,联系电话:18803697091";
String newDiscuss = discuss.replaceAll("1[35789]\\d{9}", "15225869255");
System.out.println(newDiscuss);
//替换:去掉叠字
String str = "aaabbbcdefgggghh哈哈哈哈";
//规则:多个字符挨在一起,并且字符一样
//使用(模块):形成一个组,组有组编号
String regex = "(.)\\1+";
String str2 = str.replaceAll(regex, "$1");
System.out.println(str2);
String str = "我...我我...我...喜喜...喜....欢....欢欢....你";
//1.使用替换:将"."替换成""
str = str.replaceAll("\\.+", "");
//2.去叠字
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
三、使用场景
1.验证邮箱
/* 邮箱验证分析:428308399@qq.com Crazy1191@163.com
* 第一个模块:可以为数字,字母,下划线,长度3-12位
* 第二个模块:要么为纯数字,要么为纯字母,长度2-6
* 第三个模块:.com,可以出现的次数为1-3*/
public void test5(){
String email = "abc123@163.com.cn";
//分开写
String regex1 = "\\w{3,12}@[a-zA-z]{2,6}(\\.[a-zA-Z]{2,3}){1,3}";//第二个模块纯字母
String regex2 = "\\w{3,12}@\\d{2,6}(\\.[a-zA-Z]{2,3}){1,3}";//第二个模块纯数字
boolean falg1 = email.matches(regex1) || email.matches(regex2);
//合并写
String regex = "\\w{3,12}@([a-zA-z]{2,6}|\\d{2,6})(\\.[a-zA-Z]{2,3}){1,3}";
boolean flag2 = email.matches(regex);
System.out.println("flag2:" + flag2);
}
2.校验身份证
public void test1() throws ParseException {
/*思路分析:
(1)、长度为18位
(2)、前面17位必须为纯数字
(3)、最后一位可以为X,也可以为数字
*/
String regex1 = "\\d{17}[0-9X]";
String idCard = "42010620190910235X";
boolean flag = idCard.matches(regex1);
System.out.println(flag?"身份证号验证通过":"身份证号有误");
}
3.对IP地址归类
public void test7(){
/* 思路分析:如何将IP地址排序归类
* 对id地址归类:A、B、C、D A-D的区间范围在1-255之间
* 102.254.38.12
* 11.12.122.25
* 123.123.45.12 */
String strs = "102.254.38.12,11.12.122.25,123.123.45.12";
//1.将每个ip地址中的位数添加两个0
strs = strs.replaceAll("(\\d{1,3})","00$1");
//2.将ip字符串中的每个模块变成3个数字
strs = strs.replaceAll("0+(\\d{3})","$1");
System.out.println("strs=" + strs);
//3.将给定的字符串切割成数组
String[] attr = strs.split("\\,");
//4.创建一个TreeSet集合,存放字符串
Set<String> ipSet = new TreeSet<>();
for(String s :attr){
ipSet.add(s);
}
System.out.println("ipSet=" + ipSet);
//5.遍历TreeSet集合,将每次取到的字符串首先去除多余的0,然后在添加到List集合中去
ArrayList<String> ipList = new ArrayList<>();
for(String ip : ipSet){
String temp = ip.replaceAll("0*(\\d{1,3})","$1");
ipList.add(temp);
}
//6.遍历ArrayList集合,输出结果
for(String t : ipList){
System.out.println("t =" + t);
}
}