【Java】正则表达式基本练习1

在写练习之前,先分享一个心得:写正则表达式的时候不要上来就从全局去看,而是需要:从左到右依次写。

一、练习一:验证手机号码

需求:请编写正则表达式验证用户输入的手机号码是否满足要求。

长度为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-20240422214901469

有了这个插件之后,我们自己在写正则表达式的时候就不需要我们自己去动脑筋了。

可以这么玩:先写一个字符串变量,然后点击双引号

image-20240422215055544

然后右键,可以看见它会多一个插件的选项,然后用鼠标点一下它

image-20240422215126881

基本上我们在工作中常用的一些正则在这个里面都出现了

image-20240422215218935

例如时间,我们可以找一个 24小时制

image-20240422215251174

但是找出来之后,我们需要对它做一个修改

image-20240422215318094

/^$/ 需要删掉,^ 表示从开头开始匹配,$ 表示一直匹配到末尾。但是在Java的 matches() 方法中,默认就是从头比到尾的

然后一根 \ 的地方需要再加一个 \,因为在Java中,两根 \ 表示一个 \

image-20240422215632041

还没完,像上面有一些 ?:,它是什么意思我们后面会将,但是在这里我们将它删掉也不会产生影响。

处理完后,就是关于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));
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值