介绍
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
使用
正则表达式的可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
下面来使用一些基本的元字符进行操作,用代码来示例,
\ 一个斜杠表示将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
一、判断
使用
public boolean matches(String regex)
例如"\\d",表示检查是否为数字。
System.out.println("a".matches("\\d")); System.out.println("1".matches("\\d"));
“a”和“1”表示要检查的字符,matches表示开始检查,“\\d”表示检查规则,\\d表示检查数字。
运行结果:
如果是一串数字的话就不能这么写了。如果我的字符串是1234567890,那么就是匹配多次,就要是使用 * 了,例如
System.out.println("1234567890".matches("\\d*"));
执行之后返回true。 * 表示匹配次数为0次或者多次,这样的符号还有一些其他的,如下表所示
上述的操作貌似没有什么实际意义,那么下面写一点有意义的例子。
1. 手机号判断
比如说检查13、15、19开头的手机号,那么就可以这么写。
public static void main(String[] args) { String phoneNum = "1[359]\\d{9}"; String[] phoneArr = {"13575137717","15575137717","19575137717","195751377171","1957513771"}; for (String s : phoneArr) { System.out.println(s.matches(phoneNum)); } }
下面来说一下这个正则表达式 1[359]\\d{9} ,1表示开头的字符,[359]表示里面的3、5、9任意一个字符,后面的\\d表示检查数字,{9}表示匹配9次,加上前面的两位就是11位,下面运行一下,看这个结果就很明显了,
最后两个为什么为false呢,因为有一个12位数字,一个是10位数字,不符合手机号的要求。
2. 姓名判断
正则其实还判断是否为中文,例如:汉族人的姓名通常是2到4个字,那么就可以这么来写。
public static void main(String[] args) { String userNameRegex = "^[\\u4e00-\\u9fa5]{2,4}"; String[] nameArr = {"王","段誉","李世民","诸葛山珍","西毒欧阳锋"}; for (String name : nameArr) { System.out.println(name.matches(userNameRegex)); } }
下面来解释一下:^ 是匹配输入字符串开始的位置,\u4e00-\u9fa5”是unicode编码,一种全世界语言都包括的一种编码。(国际化功能中常常用到),\u4e00-\u9fa5是用来判断是不是中文的一个条件。{2,4}是匹配2到4次,一个匹配一个字符,所以1和5不在范围内,运行结果如下:
3. 身份证号判断
身份证号判断通常在用户实名认证的时候,不过现在基本上都会使用第三方平台直接接入,不过依然还是要知道怎么判断的身份证号。可以这么来写。
public static void main(String[] args) { String idCardRegex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}([0-9Xx])$"; String idCard = "430428196808158292"; System.out.println(idCard.matches(idCardRegex)); }
可以运行一下,肯定是true。 可以使用自己的身份证进行一下验证,有问题的话告诉我,我及时改正。
你会发现这个正则表达式好长,一下子人就看懵了,下面进行逐步的分解。
分析:
[1-9]\\d{5}表示身份证前6位,也就是地址码。
(18|19|20)\\d{2},表示年份,这里的|表示或者的意思,也就是说18、19、20。\\d{2}表示具体的年份。这里的年份可以根据实际业务需要自己再去更改。
((0[1-9])|(1[0-2])) 表示月份,月份是01 - 12。(0[1-9]),表示0开头,[1-9]就可以匹配除0之外任意一个数字,如果月份不是0开头,就会进入(1[0-2]),匹配范围就是10、11、12。
(([0-2][1-9])|10|20|30|31),这里表示日期,01-31。([0-2][1-9])表示,01-09、11-19、21-29,然后通过|10|20|30|31补齐剩余的日期。
\\d{3} 顺序码,数字即可。
([0-9Xx])$ 校验码 ,校验码可以是0 - 9 、X、x。$ 表示结束。
4. QQ判断
在日常的应用注册中,对于QQ的检查也是常见的,而QQ号最短是5位、最长是10位。第一个数字在1-9之间,第二个数字在0-9之间。因此可以这样写:
public static void main(String[] args) { String qqRegex = "[1-9][0-9]{4,9}"; String[] qqStr = {"55555","123456","12337789","1317986759","0323429","47892799778"}; for (String qq : qqStr) { System.out.println(qq.matches(qqRegex)); } }
运行一下:
相信这个正则就不用解释了。
5. 邮箱判断
邮箱也是常用的,代码如下:
public static void main(String[] args) { String emailRegex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; String[] emailStr = {"lonelyholiday@qq.com","123@163.com","dadadadasd@","www.casda@"}; for (String email : emailStr) { System.out.println(email.matches(emailRegex)); } }
运行结果:
这个正则就有必要说一下了,
- \w 表示匹配字符,\W表示匹配非字符。
- [-+.] 表示可以使用 - 、+ 、.
- @ 就是邮箱特有的符号
- \.表示除换行符以外的所有字符。
后面的就都是常规的了
这么一来你是不是觉得正则表达式挺有意思的,手动滑稽
二、分割
public String[] split(String regex)
这个分割其实在开发中很常见的,下面举例说明。
1. 字符分割
public static void main(String[] args) { String dateStr = "2021-07-11"; for (String s : dateStr.split("-")) { System.out.println(s); } }
运行结果:
上面是通过 - 来分割字符串变成一个字符串数组,然后遍历打印。
2. 字符串分割
例如有一个字符串里面有数字和字母,我要得到字母,
public static void main(String[] args) { String str = "abc1123das32dsa36das34DA"; for (String s : str.split("\\d+")) { System.out.println(s); } }
运行一下:
那如果要得到数字呢?
public static void main(String[] args) { String str = "abc1123das32dsa36das34DA"; for (String s : str.split("[a-zA-Z]+")) { System.out.println(s); } }
字母分大写小写,运行结果如下:
三、替换
public String replaceAll(String regex,String replacement)
1. 字符串替换
public static void main(String[] args) { String str = "abc123"; String resultStr = str.replaceAll("\\d+", "defg"); System.out.println(resultStr); }
将数字替换为字母,运行一下:
2. 字符替换
public static void main(String[] args) { String str = "2021-07-11"; String resultStr = str.replaceAll("-", "/"); System.out.println(resultStr); }
如果是Android开发者的话可以是我的开源库里面,通过依赖直接使用相应的正则进行相应的检查
库里是一些Android开发中常用的工具类,会一直更新,也希望多提宝贵意见。
欢迎Stat 和 Fork。












