正则表达式

正则表达式的组成规则
字符
x 字符 x

字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]

Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

正则表达式的判断功能
public boolean matches(String regex) 通知此字符串是否匹配给定的正则表达式。
//正确校验手机号:组成规则是 长度是11,以1开头,第二位是3或5或8
String tel="158858880644";
//定义规则:1表示第一位只能是1,[358]表示第二位只能是3或5或8,
//剩下的是0--9之间的任意数字,手机号恰好是11位,所以,剩下的恰好是9次
//所以对应写法就是[0-9]{9}
String regex ="1[358][0-9]{9}";
System.out.println(tel.matches(regex));//如果匹配返回true

正则表达式的分割功能
public String[] split(String regex) 根据给定的正则表达式的匹配来拆分此字符串。
String str ="张三-李四-王五";
//定义规则
String regex="-";
String[] arr = str.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}

正则表达式的替换功能
public String replaceAll(String regex,String replacement) 使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
String s ="112233";
String s2 = s.replaceAll("11","99");
System.out.println(s+"将11替换为99替换后为:"+s2);

String str="zhangssssqingzzzlun";
String s = str.replaceAll("(.)\1+", "@");
System.out.println(str+"将叠词替换成@替换后为::"+s);

正则表达式的获取功能
//取出长度为3的单词
String str ="da jia hao wo shi zhang qing lun wo cao !";
//将规则封装成对象,\b表示单词的边界,[a-zA-Z]{3}表示字母恰好出现3次
Pattern p = Pattern.compile("\b[a-zA-Z]{3}\b");
//得到匹配器对象
Matcher m = p.matcher(str);
while(m.find()) {//m.find();含有下一个匹配的元素
System.out.println(m.group());//取出匹配的元素
}

正则案例

正则校验QQ
String qq="1234567894567845678";
//[1-9]表示第一位只能是1--9,不包含0
//[0-9]{4,14}表示0--9至少出现4次,最多出现14次,
//因为要求是5--15次,除去第一位,所以是4--14
String s ="[1-9][0-9]{4,14}";
System.out.println(qq.matches(s));

结果说明:只有满足该正则的字符串返回值才是true
我们在做测试时,各种情况都要测试,也就是我们的测试:比如:
1.第一位为0的情况
2.长度不足5位或者超出15位
3.含有字母等
4.正确演示

正则校验手机
//正确校验手机号:组成规则是 长度是11,以1开头,第二位是3或5或8
String tel="158858880644";
//定义规则:1表示第一位只能是1,[358]表示第二位只能是3或5或8,
//剩下的是0--9之间的任意数字,手机号恰好是11位,所以,剩下的恰好是9次
//所以对应写法就是[0-9]{9}
String regex ="1[358][0-9]{9}";
System.out.println(tel.matches(regex));//如果匹配返回true

结果说明:只有满足该正则的字符串返回值才是true
测试时应该涵盖所有的情况。

正则校验邮箱
//用户名@域名
例如:116zql@jiyun.com 116zql@jiyun.com.cn 116zql@jiyun.com.cn.org
String email="116zql@jiyun.com.cn";
//[a-zA-Z_0-9]+@[a-zA-Z0-9]+表示用户名
//(\.[a-zA-Z]{2,3}){1,3}表示域名,{2,3}表示类似com,cn这样的域名单词字符数
{1,3}表示com,cn这样的域名只能出现1—3次
String regex="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]{2,3}){1,3}";
System.out.println(email.matches(regex));
// 结果:true

正则分割字符串
String str ="张三---李四------王五-赵六--周七";
//定义规则。"-+"表示"-"出现一次或者多次
String regex="-+";
String[] arr = str.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}

正则屏蔽敏感词汇
//手机号隐藏中间四位
String s ="13885888064";
//344类型的手机号,前三位第一组,中四为第二组,后四为第三组
//将中间的用替换,第一种组和第三组不变,不同的正则之间使用组是通过$+组名
String s2 = s.replaceAll("(\d{3})\d{4}(\d{4})", "$1
$2");
System.out.println(s2);

上一篇:vue监听el-input输入禁止emoji表情


下一篇:如何解决codeforces使用java提交时显示Source should satisfy regex [^{}]*public\s+(final)?\s*class\s+(\w+).*问题