在写练习之前,先分享一个心得:写正则表达式的时候不要上来就从全局去看,而是需要:从左到右依次写。
一、练习一:验证手机号码
需求:请编写正则表达式验证用户输入的手机号码是否满足要求。
长度为11位,开头必须为1,第2为必须为 3-9
,从第三位开始,都可以是任意的数字了
验证手机号码 13112345678 13712345667 13945679027 139456790271
第一部分:1 表示手机号码只能以1开头
String regex1 = "[1]";
但是此时括号已经没有必要了,因为只有一个数字,因此我们可以将括号删掉,直接写 1
就行了。
String regex1 = "1";
第二部分:[3-9] 表示手机号码第二位只能是3-9之间的
String regex1 = "1[3-9]";
最后,从第三位开始,都可以是任意的数字了
第三部分:\\d{9}
表示任意数字可以出现9次,也只能出现9次
String regex1 = "1[3-9]\\d{9}";
验证
System.out.println("13112345678".matches(regex1));//true
System.out.println("13712345667".matches(regex1));//true
System.out.println("13945679027".matches(regex1));//true
System.out.println("139456790271".matches(regex1));//false
二、练习二:验证座机号码
需求:验证座机电话号码 020-2324242,02122442,027-42424,0712-3242434
在书写座机号正则的时候需要把正确的数据分为三部分
一:区号@\\d{2,3}
,0
:表示区号一定是以0开头的,\d{2,3}
:表示区号从第二位开始可以是任意的数字,可以出现2到3次。
String regex2 = "0\\d{2,3}";
二:-
,这个 -
可以出现也可以不出现,并且如果出现,也只能出现一次
?
:表示次数,零次或一次
PS:如果 [a-z]
这样 -
写在 []
里面,表示的是一个范围;但是当你把 -
写在 []
外面,它表示的就是 -
本身,即普通字符。
String regex2 = "0\\d{2,3}-?";
三:号码
号码的第一位也不能以0开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
验证
System.out.println("020-2324242".matches(regex2)); // true
System.out.println("02122442".matches(regex2)); // true
System.out.println("027-42424".matches(regex2)); // true
System.out.println("0712-3242434".matches(regex2)); // true
三、练习三:验证邮箱号码
需求:请编写正则表达式验证用户输入的邮箱号是否满足要求。
验证邮箱号码 3232323@qq.com、zhang_san@itcast.cn、dlei0009@163.com、dlei0009@pci.com.cn
跟刚刚一样,我们书写的时候一定要拿着正确的邮箱号码从左到右一个一个写。
在书写邮箱号码正则的时候需要把正确的数据分为三部分
第一部分:@的左边可以是数组,也可以是字母,甚至还有可能是下划线,因此可以写成\w+
任意的字母数字下划线,至少出现一次就可以了
+
表示:出现一次或多次
String regex3 = "\\w+";
第二部分:@ 只能出现一次
String regex3 = "\\w+@";
第三部分更复杂了,这个也是邮箱的难点,这一部分还需要分成三小份来看
.的左边
:可以是字母,可以是数字,但是不能是下划线,总共出现2-6次
。[\\w&&[^_]]{2,6}
String regex3 = "\\w+@[\\w&&[^_]]{2,6}";
.
:第二部分就一个 .
,但是我们不能直接写 .
,因为 .
表示匹配任意字符。
此时我们就需要转义 .
,由于在Java中,两个 \
表示一个 \
,因此这里应该写 \\.
PS:在正则表达式中\
的本义是一个普通的字符;但是在正则表达式外面\
是转义字符
String regex3 = "\\w+@[\\w&&[^_]]{2,6}\\.";
.的右边
:大写字母,小写字母都可以,只能出现2-3次 [a-zA-Z]{2,3}
String regex3 = "\\w+@[\\w&&[^_]]{2,6}\\.[a-zA-Z]{2,3}";
我们在读这个正则表达式的时候,以 @
为中心来看两边,然后再以 .
为中心看两边
看一下这个示例:dlei0009@pci.com.cn
,它后面还有一个 .cn
,因此我们还需要再做一个动作:我们需要将这里的 .
跟后面的 com
看成是一组,这一组是可以出现一次或两次。
因此我们可以将这一组用小括号括起来,小括号就表示分组的意思:([a-zA-Z]{2,3})
String regex3 = "\\w+@[\\w&&[^_]]{2,6}\\.([a-zA-Z]{2,3}){1,2}";
验证
System.out.println("3232323@qq.com".matches(regex3)); // true
System.out.println("zhangsan@itcast.cnn".matches(regex3)); // true
System.out.println("dlei0009@163.com".matches(regex3)); // true
System.out.println("dlei0009@pci.com.cn".matches(regex3)); // true
四、插件
很多同学在刚开始学习正则表达式的时候,看得懂别人的正则表达式,但是自己在写的时候就不会了。
这个情况是很正常的,在实际开发中,一般很少会自己去写正则表达式,一般都会先百度一个类似的,然后再改成公司要求的就行了。
因此针对正则表达式,只需要你能听得懂,看得懂,给你一个正则表达式,能改成自己想要的就行了。
那应该怎么改呢?别着急,这里会分享一个插件。
File ——> settings ——> Plugins ——> 搜索 any-rule
插件 ——> 安装即可
有了这个插件之后,我们自己在写正则表达式的时候就不需要我们自己去动脑筋了。
可以这么玩:先写一个字符串变量,然后点击双引号
![image-20240422215055544](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fteststock.oss-cn-hangzhou.aliyuncs.com%2Fimage-20240422215055544.png&pos_id=img-GnFz0d43-1719754132303%29)
然后右键,可以看见它会多一个插件的选项,然后用鼠标点一下它
![image-20240422215126881](https://img-blog.csdnimg.cn/img_convert/d2df63d5c9d4d1e6aeb926dbd79e8dac.png)
基本上我们在工作中常用的一些正则在这个里面都出现了
![image-20240422215218935](https://img-blog.csdnimg.cn/img_convert/28f9e2c15cb452bbd43fb927f11c3588.png)
例如时间,我们可以找一个 24小时制
![image-20240422215251174](https://img-blog.csdnimg.cn/img_convert/0509080a49506779b46c988d14d73cd5.png)
但是找出来之后,我们需要对它做一个修改
![image-20240422215318094](https://img-blog.csdnimg.cn/img_convert/2230f04ac61d2ffe6fed0a74b6038e5e.png)
/^
和 $/
需要删掉,^
表示从开头开始匹配,$
表示一直匹配到末尾。但是在Java的 matches()
方法中,默认就是从头比到尾的
然后一根 \
的地方需要再加一个 \
,因为在Java中,两根 \
表示一个 \
还没完,像上面有一些 ?:
,它是什么意思我们后面会将,但是在这里我们将它删掉也不会产生影响。
处理完后,就是关于24小时的正则表达式了
String regex6 = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
我们可以来读一下它,能看懂就行了。
首先需要知道,24小时的时间表达形式是什么样的?例如:23:11:11
,可以发现,它是分成三部分的。
因此我们在阅读正则表达式的时候,也以冒号为区分。
先来看第一部分:([01]\\d|2[0-3])
,这里有一个 |
,|
表示或者的意思,它表示左边是一个正则,右边也是一个正则,左右两个,满足其中一个就可以了。
因为在24小时时间制中,小时可以写 01、02、03....
,当然也可以写 10、12、13....
,还可以写 20、22、23
,所以它把它分开写了:第一个正则表达式是考虑前两种情况,然后从第二位开始,就可以是 //d
了;第二个正则表达式就是:2[0-3]
,即考虑到 20、22、23
的情况。
分钟其实也是引用的道理,第一位只能是 0 - 5
,不能再大了,后面的第二位可以是任意的数字,所以是 \\d
。
秒钟跟分钟是一样的。
验证:
//24小时的正则表达式
String regex6 = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
System.out.println("23:11:11".matches(regex4));
这个正则表达式其实还可以用我们刚刚讲的分组来进行优化:分钟跟秒钟规则是一样的,既然是一样的,就没必要再写一遍了
String regex7 = "([01]\\d 2[0-3])(:[0-5]\\d){2}";
System.out.println("23:11:11".matches(regex5));
因为在24小时时间制中,小时可以写 01、02、03....
,当然也可以写 10、12、13....
,还可以写 20、22、23
,所以它把它分开写了:第一个正则表达式是考虑前两种情况,然后从第二位开始,就可以是 //d
了;第二个正则表达式就是:2[0-3]
,即考虑到 20、22、23
的情况。
分钟其实也是引用的道理,第一位只能是 0 - 5
,不能再大了,后面的第二位可以是任意的数字,所以是 \\d
。
秒钟跟分钟是一样的。
验证:
//24小时的正则表达式
String regex6 = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
System.out.println("23:11:11".matches(regex4));
这个正则表达式其实还可以用我们刚刚讲的分组来进行优化:分钟跟秒钟规则是一样的,既然是一样的,就没必要再写一遍了
String regex7 = "([01]\\d|2[0-3])(:[0-5]\\d){2}";
System.out.println("23:11:11".matches(regex5));