作用:
- 校验字符串是否满足规则
- 在一段文本中查找满足要求的内容
字符类(只匹配一个字符)
正则表达式 | 说明 |
---|---|
[abc] | 只能是a,b,或c |
[^abc] | 除了a,b,c之外的任何字符 |
[a-zA-Z] | a到z A到Z,包括(范围) |
[a-d[m-p]] | a到d,或m到p |
[a-z&&[def]] | a-z和非bc的交集,为d,e,f |
[a-z&&[^bc]] | a-z和非bc的交集(等同于[ad-z]) |
[a-z&&[^m-p]] | a到z和除了m到p的交集(等同于[a-lq-z]) |
package Regex正则表达式;
public class demo2 {
public static void main(String[] args) {
//只能是 a b c (一个字符) [abc]
System.out.println("a".matches("[abc]"));//ture
System.out.println("z".matches("[abc]"));//false
System.out.println("ab".matches("[abc]"));//false
System.out.println("ab".matches("[abc][abc]"));//true
//不能出现 a b c [^abc]
System.out.println("a".matches("[^abc]"));//false
System.out.println("e".matches("[^abc]"));//true
//a到z A到Z(包括头尾的范围) [a-zA-Z]
System.out.println("a".matches("[a-zA-Z]"));//true
System.out.println("z".matches("[a-zA-Z]"));//true
//a到d或 m到p [a-d[m-p]]
System.out.println("a".matches("[a-d[m-p]]"));//true
System.out.println("m".matches("[a-d[m-p]]"));//true
//a到z或和def交集 [a-z&&[def]] 为 d e f
//细节:如果要求两个范围的交集,那么需要写符号&&
// 如果写成了一个8,那么此时&表示就不是交集了,而是一个简简单单的&符号
System.out.println("a".matches("[a-z&&[def]]"));//false
System.out.println("d".matches("[a-z&&[def]]"));//true
//a到z或和非bc交集 [a-z&&[^bc]] (等同于[ad-z])
System.out.println("a".matches("[a-z&&[^bc]]"));//true
System.out.println("b".matches("[a-z&&[^bc]]"));//false
//a到z或和非m到p交集 [a-z&&[^m-p]] (等同于[a-lq-z])
System.out.println("a".matches(" [a-z&&[^m-p]] "));//true
System.out.println("m".matches(" [a-z&&[^m-p]] "));//false
}
}
预定义字符(只匹配一个字符)
正则表达式 | 说明 |
---|---|
. | 任何字符(除了\n) |
\d | 一个数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 一个空白字符:[\t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | [a-zA-Z_0-9]英文、数字、下划线 |
\W | [^\w]一个非单词字符 |
数量词
正则表达式 | 说明 |
---|---|
X? | X,一次或者0次 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n] | X,正好n次 |
X{r, } | X,至少n次 |
X{n,m} | X,至少n次但不超过m次 |
package Regex正则表达式;
public class demo3 {
public static void main(String[] args) {
//. 表示任意一个字符
System.out.println("你".matches(".."));//false
System.out.println("你好".matches(".."));//false
// \d 只能是任意的一位数字
// \ 为转义字符 简单记忆:两个\表示一个\
System.out.println("你好".matches("\\d"));//false
System.out.println("333".matches("\\d"));//false
System.out.println("2".matches("\\d"));//true
// \\w(小写)只能是一位单词字符[a-zA-Z_0-9]
System.out.println("21".matches("\\w"));//false
System.out.println("a".matches("\\w"));//true
System.out.println("你".matches("\\w"));//true
System.out.println("_".matches("\\w"));//true
//非单词字符 \\W(大写)
System.out.println("你".matches("\\W"));//false
//以上只能校验单个字符================
//必须是数字 、字母、下划线 至少是6位
System.out.println("244f".matches("\\w{6,}"));//false
System.out.println("2442ffffff".matches("\\w{6,}"));//true
//必须是数字和字符 必须是四位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
}
}
其余小细节:
符号 | 含义 | 举例 |
---|---|---|
[ ] | 里面的内容出现一次 | [0-9] |
( ) | 分组 | a(bc)+ |
&& | 交集,不能写单& | [a-z&&m-p] |
| | 写在方括号外面表示并集 | [a-zA-Z0-9] x|X |
? | 0次或1次 | \\d? |
* | 0次或多次 | \\d* (abc*) |
+ | 1次或多次 | \\d+ (abc)+ |
{ } | 具体次数 | a{7} \\d{7,19} |
(?i) | 忽略后面字符的大小写 | (?i)abc |
a((?i)b)c | 只忽略b的大小写 | a((?i)b)c |
编写的小方法:
第一步:按照正确的数据进行拆分
第二步:找每一部分的规律,并编写正则表达式
第三步:把每一部分的正则拼接在一起,就是最终的结果
书写的时候:从左到右去书写。
例子一:
package Regex正则表达式;
public class text1 {
public static void main(String[] args) {
//方法:
//拿着正确的数据,从左到右依次去写
//分成三部分:
//第一部分:1 表示手机号码只能以1开头
//第二部分:[3-9]表示手机号码第二位只能是3-9之间的
// 第三部分:\\d{9}表示任意数字可以出现9次,也只能出现9次
String regex1="1[0-9]\\d{9}";
//String regex1="1[0-9][0-9]{9}";
System.out.println("10016332218".matches(regex1));
System.out.println("100163322180".matches(regex1));
System.out.println("---------------------------------");
//验证座机号码
//020-2324242 02122442 027-42424 0712-3242434
//思路:
//在书写座机号正则的时候需要把正确的数据分为三部分
//一:区号 0\\d{2,3}
// 0:表示区号一定是以0开头的
// \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次
//二: -?表示次数,0次或一次
//三:号码号码的第一位也不能以0开头,从第二位开始可以是任意的数字,号码的总长度:5-10位(自己定义的)
//但要写{4,9}的原因是前面的[1-9]也算一位
String regex2="0\\d{2,3}-?[1-9]\\d{4,9}";
System.out.println("020-2324242".matches(regex2));
System.out.println("02122442".matches(regex2));
System.out.println("027-42424".matches(regex2));
System.out.println("0712-3242434".matches(regex2));
System.out.println("=========================================");
邮箱号码
//3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
//思路:
//在书写邮箱号码正则的时候需要把正确的数据分为二部分
// 第一部分:@的左边\\w+
// 任意的字母数字下划线,至少出现一次就可以了
// 第二部分:@ 只能出现一次
//第三部分:
//3.1 .的左边[\\w&&[^_]]{2,6}
// 任意的字母加数字,总共出现2-6次(此时不能出现下划线)
//3.2 . \\. (用转义字符)
// 大写字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
// 3.3我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
//dlei0009@pci.com.cn 指.com.cn 这种情况
String regex3="\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
System.out.println("3232323@qq.com".matches(regex3));
System.out.println("dlei0009@pci.com.cn".matches(regex3));
//可以用插件any-rule
}
}
例子二:
package Regex正则表达式;
public class text2 {
public static void main(String[] args) {
// 需求
//请编写正则表达式验证用户名是否满足要求。
//要求:大小写字母,数字,下划线一共4-16位请编写正则表达式验证身份证号码是否满足要求
//简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x
// 复杂要求:按照身份证号码的格式严格要求。
//请编写正则表达式验证用户名是否满足要求。
//要求:大小写字母,数字,下划线一共4-16位
String regex1="\\w{4,16}";
//简单要求:
// 18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x
String regex2="[1-9]\\d{16}(\\d|X|x)";
//[]里面的内容任意出现一次
String regex3="[1-9]\\d{16}[\\dXx]";
//继续修改
String regex7="[1-9]\\d{16}(\\d|(?i)x)";
System.out.println("----------------");
//忽略大小写
//在匹配的时候忽略abc的大小写
String regex4="(?i)abc";
System.out.println("----------------");
System.out.println("abc".matches(regex4));
System.out.println("aBC".matches(regex4));
System.out.println("ABC".matches(regex4));
//在匹配的时候忽略bc的大小写
String regex5="a(?i)bc";
//在匹配的时候忽略b的大小写 a((?i)b)c 指ac要完全一样,c可以不区分大小写
String regex6="a((?i)b)c";
System.out.println("---------------------------");
//编写正则的小心得:
//第一步:按照正确的数据进行拆分
//第二步:找每一部分的规律,并编写正则表达式
//第三步:把每一部分的正则拼接在一起,就是最终的结果
//书写的时候:从左到右去书写。
// 复杂要求:按照身份证号码的格式严格要求。
//4188011993 02 28 457X
//前面6位:省份,市区,派出所等信息,第一位不能是8,后面5位是任意数字
//[1-9]\\d{5}
//年的前半段:18 19 20
// (18|19|20)
//年的后半段:任意数字出现两次
// \\d{2}
//月份: 01~09 10~12
// (0[1-9]|1[0-2])
//日期: 01~31 01~09 10~19 20~29 30~31
// 方法一:(0[1-9]|1[0-9]|2[0-9]|3[0-1])
// 方法二:0[1-9]|[12]\\d|3[01]
//后面四位:任意数字出现3次 最后一位可以是数字也可以是大写X或者小写x
// 方法一:\\d{3}(?i)x
// 方法二:\\d{3}[\\dXx]
String regex8="[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";
System.out.println("41880119930228457X".matches(regex8));
String regex10="[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]";
System.out.println("41880119930228457X".matches(regex10));
}
}
注意:
其余的正则表达式可以在
[Java参考文档].JDK_API_1_6_zh_CN.CHM
方法:
- 查找Pattern类
- 先查找String 类 然后找matches方法
简单方法嘻嘻:
直接在IntelliJ IDEA 2023.1 安装一个插件any-rule(前提是要懂得修改哈)