正则表达式
一.什么是正则表达式?
-
正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串的搜索模式
-
用某种模式去匹配一类字符串的公式
-
正则表达式类似于生活中的合同。使用特殊的符号来操作字符串,用来判断字符串是否满足匹配的规则。
-
正则的作用:
- 测试字符串内的模式
- 替换文本
- 从字符串中提取子字符串
-
优点:大大的简化代码量
-
缺点:阅读性差
二.正则语法
字符 | 匹配 | 用法 |
---|---|---|
. | 所有字符 | 注意:\\. 表示 . |
\ | 转义符 | 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] | 匹配汉字 | 有事100,有酒罚我 |
? | 表示匹配的字符出现的次数为0或1次 | |
+ | 一次或多次 | |
* | 零次或多次 | |
{n} | n次 | |
{n,} | 至少n次 | |
{n,m} | 至少n次,至多m次 |
三.案例
1.匹配
//验证手机号:1. 长度 11位 2.纯数字 3.第二位数字为[35789]
private static void fun1() {
String phone="13565248952";
String reg="[1][35789][0-9]{9}";
String reg1="1[35789]\\d{9}";
boolean f = phone.matches(reg1);
System.out.println(f);
}
2.切割
- 术语解释:将指定的字符串按照给定的规则(正则表达式)进行切割。
//切割
private static void fun2() {
String names="张三.李四.王二麻子";
String[] ns = names.split("\\.");
System.out.println(Arrays.toString(ns));
}
3.替换
- 术语解释:将指定的字符串按照给定的规则(正则表达式)替换成新的字符串,返回值是String
//替换--电话
private static void fun3() {
String info="我家的娃娃体验感更好,联系方式:13538384938";
String newInfo = info.replaceAll("1[35789][0-9]{9}", "110");
System.out.println(newInfo);
}
- 过滤叠词
//替换--叠词--分组
private static void fun4() {
String s="你好胖胖呀,肉肉好多呀,你好坏坏坏呀呀呀呀!";
//String reg="(.)\\1{1,}";//1:再出现一次 ,共两次
String reg="(.)\\1+";//1:再出现一次 ,共两次
String ss = s.replaceAll(reg, "$1");
System.out.println(ss);
}
4.分组
- (.) 表示 匹配任意一个字符,作为一组
- (.(a)) 整体作为第一组
\\1
,内层 (a)作为第二组\\2
- $1用于取出第一组 , $2用于取出第二组
//替换--叠词--分组
private static void fun5() {
//区分匹配到的 和 获取到的
String s="吃饭饭";
String reg="(.(饭){2})";
//String reg="(.(饭))\\2";
String ss = s.replaceAll(reg, "$1");
System.out.println(ss);//吃饭 替换 吃饭饭
String s1="吃饭饭吃饭饭";
String reg2="(.(饭){2})\\1";
String h = s1.replaceAll(reg2, "$1");
System.out.println(h);//吃饭饭
}
拓展 - 白冰的表白
//1:白冰:我喜欢你
private static void fun6() {
String s="白冰:我喜喜...喜..喜喜..欢...欢欢..欢.欢欢.欢....你";
//1.替换 . ""
String reg="\\.+";
String s1 = s.replaceAll(reg, "");
System.out.println(s1);
//2.去叠词--分组 我喜喜喜喜喜欢欢欢欢欢欢欢你
String reg2="(.)\\1+";
String s2 = s1.replaceAll(reg2, "$1");
System.out.println(s2);
}
- 邮箱验证
/*
邮箱
模块一:数字,字母,下划线 长度 3-12
模块二:要么纯数字,要么纯字母,长度 2-6
模块三:.com .cn 出现次数 1-3
*/
private static void fun7() {
String mail="abc_1243@163.com.cn";
String reg="\\w{3,12}@(\\d{2,6}|[a-zA-Z]{2,6})(\\.[a-z]{2,3}){1,2}";
boolean f = mail.matches(reg);
System.out.println(f);
}
- 年龄
// 年龄130以内 1-99 | 100-129 | 130
private static void fun8() {
String age="-13";
String reg="[1-9]\\d?|1[012]\\d|130";
System.out.println(age.matches(reg));
}
- 汉字和空格
private static void fun9() {
String s="你好 ";
String reg="^[\\u4e00-\\u9fa5]{2}\\s{2}";
boolean m = s.matches(reg);
System.out.println(m);
}
拓展
<form id="form1" action="http://111.13.100.91/" method="post">
<table border="1" width="600">
<tr>
<td>昵称:</td>
<td><input type="text" name="nick" pattern=".{4,10}" required placeholder="请输入4-10的字符"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="pwd" pattern=".{6,16}" required placeholder="请输入6-16位字符"></td>
</tr>
<tr>
<td>手机号:</td>
<td><input type="text" name="phone" pattern="1[35789]\d{9}" required placeholder="请输入正确的手机号码"></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="email" name="email" required placeholder="请输入正确的邮箱格式"></td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" pattern="^[1-9]\d*$" name="age" placeholder="请输入一个正数"></td>
</tr>
<tr>
<td><input type="submit" value="注册"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>