在项目的开发中,经常有一些特定规则的字符串,如手机号、邮箱、或者用户输入的密码等等。这些字符串都有一些特定的格式,按照这种格式去校验用户输入的字符串是否合法,在很大程度上简化了代码。而这种特定格式的校验,我们称之为正则表达式(英语:Regular Expression,其在代码中经常简写为regex、regexp或re)。
下面我将举三个最常用的例子,来初步说明正则表达式。
ex 1:手机号正则表达式的写法:
java:
String PHONE_NUMBER_REG = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
java中使用“^”开头、“$”结尾,使用“|”表示 或 。“[0-9]”或者“\\d”表示0-9的数字(第一个"\"代表转义字符),“{n}”表示其相邻的那个表达式需要n个该格式的字符。手机号格式便是如上所示的表达式,具体使用方法:phoneNumber.matchs(PHONE_NUMBER_REG)
JS:
"18016381232".match(/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/)
JS中写法和java中很类似,但是开头和结尾处有所不同,此处开头使用“/^”,结尾使用“/$”,调用match方法直接匹配即可。
ex 2:邮箱正则表达式写法:
邮箱需要满足的逻辑:
(1)@之前必须you内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.);
(2)@和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着;
(3)最后一个点(.)之后必须有内容且只能是字母(大小写)、数字且长度大于等于2个字节、小于等于6个字节。
^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$
其中“+”号表示其前面的子表达式需要至少一个(一个或多个),等价于{1,}。“\.”代表点(.),此处“\”为转义字符。“*”代表0个或多个,等价于{0,}。{2,6}则表示其前面的子表达式至少2个,最多6个。
ex 3:密码正则表达式(以下表达式不一定能满足,看自己的需求):
密码需要满足的的逻辑:
(1)密码长度不能小于八位;
(2)密码需包含字母(区分大小写)、数字、特殊字符中的至少三种字符。
//判断密码是否包含数字:包含返回1,不包含返回0
int i = password.matches(".*\\d+.*") ? 1 : 0;
//判断密码是否包含大写字母:包含返回1,不包含返回0
int j = password.matches(".*[A-Z]+.*") ? 1 : 0;
//判断密码是否包含小写字母:包含返回1,不包含返回0
int k = password.matches(".*[a-z]+.*") ? 1 : 0;
//判断密码是否包含特殊符号(~!@$%^&*()_+|<>,.?/:;'[]{}\):包含返回1,不包含返回0
int l = password.matches(".*[~!@$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*") ? 1 : 0;
//获取密码长度
int m = password.length();
if((i+j+k+l) < 3 || m < 8) {
System.out.println("密码不符合设定的规则");
}
其中“?”表示0个或1个,等价于{0,1}。
以上便是我对正则表达式的一点点总结。写的不好,欢迎批评指正!
-----不积小流,无以成江海;不积跬步,无以至千里。