正则表达式基本练习
一、练习1
1、需求
- 请编写正则表达式验证用户输入的手机号码是否满足要求。
- 请编写正则表达式验证用户输入的邮箱号是否满足要求。
- 请编写正则表达式验证用户输入的电话号码是否满足要求。
2、思路:
-
心得:
-
拿着一个正确的数据,从左到右依次去写正则表达式。
-
手机号码正则表达:
手机号:13112345678 15712345678 18812345678 139456789024
- 分成三个部分:
- 第一部分:第一位只能是1开头
- 第二部分:第二位是3-9
- 第三部分:第二位之后的是0-9(任意数字)
- 分成三个部分:
-
电话号码(座机)正则表达:
电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
- 分成三部分:
- 第一部分:第一位是区号(0)
- 第二部分:第二位是 “-”,出现的次数是1次或0次
- 第三部分:号码(总长度5-10)
- 号码的第一位只能是1-9开头
- 第一位之后的是0-9(任意数字)
- 分成三部分:
-
邮箱号码正则表达:
邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
- 分成三个部分:
- 第一部分:@的左边
- 可以是数字、大小写字母、下划线
- 至少要出现一次
- 第二部分:@
- 只能出现一次
- 第三部分:
- (1)“.” 的左边:可以是数字、大小写字母(除了下划线),总共出现2-6次
- (2)“.”
- (3)"."的右边:可以是大小写字母,只能出现2-3次
- 第一部分:@的左边
- 分成三个部分:
3、实现
package com.app.demo27_regex;
public class Test1 {
public static void main(String[] args) {
/*
正则表达式的基本练习1:
一、需求:
请编写正则表达式验证用户输入的手机号码是否满足要求。
请编写正则表达式验证用户输入的电话号码是否满足要求。
请编写正则表达式验证用户输入的邮箱号是否满足要求。
二、心得:
拿着一个正确的数据,从左到右依次去写正则表达式。
*/
/*
例如:
手机号:13112345678 15712345678 18812345678 139456789024
电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
*/
/*
1、手机号码正则表达
手机号:13112345678 15712345678 18812345678 139456789024
思路:
分成三个部分:
第一部分:第一位只能是1开头
第二部分:第二位是3-9
第三部分:第二位之后的是0-9(任意数字)
*/
/*正则表达式分析:
[1]: 表示手机号码的第一位只能是1开头
[3-9]: 表示手机号码的第二位只能是3-9
\\d{9}: 表示手机号码第二位之后的都是任意数字(0-9),只能出现9次
*/
String phoneRegex1 = "[1][3-9]\\d{9}";
// String类的matches()方法: 判断该字符串是否与给定的正则表达式匹配
System.out.println("13112345678".matches(phoneRegex1));
System.out.println("15712345678".matches(phoneRegex1));
System.out.println("18812345678".matches(phoneRegex1));
System.out.println("139456789024".matches(phoneRegex1));
System.out.println("---------------------------");
/*
2、电话号码(座机)正则表达
电话号码(座机):020-2324242 02122442 027-42424 0712-3242434
思路:
分成三部分:
第一部分:第一位是区号(0),第二位开始是任意数字(0-9,可以出现2-3次)
第二部分:第四位是 “-”,出现的次数是1次或0次
第三部分:号码(总长度5-10)
号码的第一位只能是1-9开头
第一位之后的是0-9(任意数字)
*/
/*
正则表达式分析:
[0]: 表示区号只能是数字0
\\d{2,3}: 表示区号之后可以是任意数字,只能出现2-3次
-?: 表示这个杠出现的次数是1次或0次(可有可无)
[1-9]: 表示号码的第一位只能是1-9开头
\\d{4,9}: 表示号码第一位之后的可以是任意数字(0-9),只能出现4-9次
*/
String phoneRegex2 = "[0]\\d{2,3}-?[1-9]\\d{4,9}";
System.out.println("020-2324242".matches(phoneRegex2));
System.out.println("02122442".matches(phoneRegex2));
System.out.println("027-42424".matches(phoneRegex2));
System.out.println("0712-3242434".matches(phoneRegex2));
System.out.println("---------------------------");
/*
3、邮箱号码正则表达
邮箱号:3232323@qq.com zhangsan@itcast.cnn d_lei0009@163.com dlei0009@pci.com.cn
思路:
分成三个部分:
第一部分:@的左边
可以是数字、大小写字母、下划线
至少要出现一次
第二部分:@
只能出现一次
第三部分:
(1)"." 的左边:可以是数字、大小写字母(除了下划线),总共出现2-6次
(2)"."
(3)"."的右边:可以是大小写字母,只能出现2-3次
(4)我们可以把(2)
*/
/*
正则表达式分析:
\\w+: 表示@左边可以是数字、大小写字母、下划线,至少出现1次
@: 表示@,只能出现1次
[\\w&&[^_]]{2,6}: 表示 . 的左边,可以是数字、字母(除了下划线),总共出现2-6次
(\\.[a-zA-Z]{2,3}){1,2}: 表示将 . 与 .右边的字母作为一组,可以出现1-2次
\\.: 表示 .
[a-zA-Z]{2,3}: 表示 . 的右边,只能是大小写字母,只能出现2-3次
*/
String mailRegex = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
System.out.println("3232323@qq.com".matches(mailRegex));
System.out.println("zhangsan@itcast.cnn".matches(mailRegex));
System.out.println("d_lei0009@163.com".matches(mailRegex));
System.out.println("dlei0009@pci.com.cn".matches(mailRegex));
}
}
true
true
true
false
---------------------------
true
true
true
true
---------------------------
true
true
true
true
Process finished with exit code 0
二、IDEA拓展知识
1、安装插件:any-rule
2、快捷编写正则表达式
三、练习2
1、需求
- 请编写正则表达式验证用户名是否满足要求:
- 要求:大小写字母、数字、下划线,长度4-16位
- 请编写正则表达式验证身份证号码是否满足要求:
- 简单要求:18位,前17位为任意数字,最后一位可以是任意数字也可以是大写或小写的x
- 复杂要求:按照身份证号码的格式严格要求。
2、思路
- 1、正则表达式验证用户名:
- 大小写字母、数字、下划线:\ \w
- 长度4-16位:\ \w{4,16}
- 2、正则表达式验证身份证号码:
- 简单:
- 前17位为任意数字:\ \d{17}
- 最后一位可以是任意数字也可以是大写X或小写x:[\ \dXx]、(\ \d|X|x)、(\ \d|(?i)x)
- 复杂:
- 前6位:省份、市区、派出所等信息,第一位不能为0,后面5位是任意数字:[1-9]\ \d{5}
- 年的前2位:18 19 20:(18|19|20)
- 年的后2位:任意数字出现两次:\ \d{2}
- 月份:01~09、10、11、12:(0[1-9]|1[0-2])
- 日期:0109、1019、20~29、30、31:(0[1-9]|12[0-9]|3[01])
- 后面四位:
- 前三位:任意数字出现3次:\ \d{3}
- 最后一位:可以是任意数字也可以是大写X或小写x:(\ \d|(?i)x)
- 简单:
3、实现
package com.app.demo27_regex;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
/*
正则表达式的基本练习2:
- 请编写正则表达式验证用户名是否满足要求:
- 要求:大小写字母、数字、下划线,长度4-16位
- 请编写正则表达式验证身份证号码是否满足要求:
- 简单要求:18位,前17位为任意数字,最后一位可以是任意数字也可以是大写或小写的x
- 复杂要求:按照身份证号码的格式严格要求。
正确的身份证号码:
41080119930228457x、510801197609022309、15040119810705387X、430102197606046442
*/
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
checkUsername(sc); // 正则校验用户名
checkID1(sc); // 简单正则校验身份证
checkID2(sc); // 复杂正则校验身份证
}
/**
* 正则校验用户名
* @param sc 键盘录入对象
*/
private static void checkUsername(Scanner sc) {
/*
- 1、正则表达式验证用户名:
- 大小写字母、数字、下划线:\\w
- 长度4-16位:\\w{4,16}
*/
String nameRegex = "\\w{4,16}";
System.out.println("------正则校验用户名-------");
System.out.println("请输入您的用户名:");
String username = sc.next();
if (username.matches(nameRegex)) {
System.out.println("用户名校验成功!");
}else {
System.out.println("用户名校验失败!");
}
}
/**
* 正则简单校验身份证号码
* @param sc 键盘录入对象
*/
private static void checkID1(Scanner sc) {
/*
- 2、正则表达式验证身份证号码:
- 简单:
- 前17位为任意数字:\\d{17}
- 最后一位可以是任意数字也可以是大写X或小写x:[\\dXx]、(\\d|X|x)、(\\d|(?i)x)
*/
// 简单正则
String IDRegex1 = "\\d{17}[\\dXx]";
System.out.println("------简单正则校验身份证号码-------");
System.out.println("请输入您的身份证号码:");
String ID = sc.next();
if (ID.matches(IDRegex1)) {
System.out.println("身份证简单校验成功!");
}else {
System.out.println("身份证简单校验失败!");
}
}
/**
* 正则复杂校验身份证号码
* @param sc 键盘录入对象
*/
private static void checkID2(Scanner sc) {
/*
- 复杂:
- 前6位:省份、市区、派出所等信息,第一位不能为0,后面5位是任意数字:[1-9]\\d{5}
- 年的前2位:18 19 20:(18|19|20)
- 年的后2位:任意数字出现两次:\\d{2}
- 月份:01~09、10、11、12:(0[1-9]|1[0-2])
- 日期:01~09、10~19、20~29、30、31:(0[1-9]|12[0-9]|3[01])
- 后面四位:
- 前三位:任意数字出现3次:\\d{3}
- 最后一位:可以是任意数字也可以是大写X或小写x:(\\d|(?i)x)
*/
// 复杂正则
String IDRegex2 = "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|12[0-9]|3[01])\\d{3}(\\d|(?i)x)";
System.out.println("请输入您的身份证号码:");
String ID2 = sc.next();
if (ID2.matches(IDRegex2)) {
System.out.println("身份证复杂校验成功!");
}else {
System.out.println("身份证复杂校验失败!");
}
}
}
------正则校验用户名-------
请输入您的用户名:
Hu_2022Abc
用户名校验成功!
------简单正则校验身份证号码-------
请输入您的身份证号码:
41080119930228457x
身份证简单校验成功!
请输入您的身份证号码:
510801217600321156
身份证复杂校验失败!
Process finished with exit code 0
四、正则表达式小结
符号 | 含义 | 举例 |
---|---|---|
[] | 里面的内容出现一次 | [0-9]、[a-zA-Z0-9] |
() | 分组 | a(bc)+ |
^ | 取反 | [^abc] |
&& | 交集,不能写单个的& | [a-z&&m-p] |
| | 写在方括号外面表示并集 | [a-zA-Z0-9]、x|X |
. | 任意字符 | \n:回车符号不匹配 |
\ | 转义字符 | \ \d |
\ \d | 0-9 | \ \d+ |
\ \D | 非0-9 | \ \D+ |
\ \s | 空白字符 | [\t\n\x0B\f\r] |
\ \S | 非空白字符 | [^\s] |
\ \w | 单词字符 | [a-zA-Z_0-9] |
\ \W | 非单词字符 | [^\w] |
? | 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 |