使用正则表达式可以方便的对数据进行匹配,还可以执行更加复杂的字符串验证、拆分、替换功能。
常用的正则规范的定义
正则表达式(Regular Expression, regex, RE):是用来简洁表达一组字符串的表达式。
常用正则规范
规范 | 描述 | 备注 |
---|---|---|
表示反斜线()字符 | ||
表示制表符 | table | |
表示换行 | newline | |
[abc] | 字符a、b或c | |
[^abc] | 表示除了a、b、c之外的任意字符 | 非 |
[a-zA-Z0-9] | 表示由字母、数字组成 | |
d | 表示数字 | Digit |
D | 表示非数字 | |
w | 表示字母、数字、下划线 | Word |
W | 表示非字母、数字、下划线 | |
s | 表示所有空白字符(换行、空格等) | Space |
S | 表示所有非空白字符 | |
^ | 行的开头 | |
$ | 行的结尾 | |
. | 匹配除换行符之外的任意字符 |
数量表示(X表示一组规范)
规范 | 描述 | 备注 |
---|---|---|
X | 必须出现一次 | |
X? | 可以出现0次或1次 | |
X* | 可以出现0次、1次或多次 | |
X+ | 可以出现1次或多次 | |
X{n} | 必须出现n次 | |
X{n,} | 必须出现n次以上 | |
X{n,m} | 必须出现n ~ m次 |
逻辑运算符(X、Y表示一组规范)
规范 | 描述 | 备注 |
---|---|---|
XY | X规范后跟着Y规范 | |
X|Y | X规范或Y规范 | |
(X) | 作为一个捕获组规范 |
捕获组:
在正则中,小括号() 表示捕获组
这个组,也就是在匹配的时候,将某一部分的字符(串)作为组处理,这个组,可以在正则表达式的其它位置或者匹配的结果中使用,如:
^s+([a-zA-Z]+?)s.+$
匹配 " abcd 这是什么"
如果没有小括号,那么匹配只有一个结果,也就是整个字符串" abcd 这是什么"
而添加了小括号,匹配就会有两个结果了:
1 " abcd 这是什么"
2 "abcd"
也就是说额外用正则表达式捕获一个字符串
常用类型的正则表达式总结
//格式验证
public class Validate {
//用户名验证
public static Boolean userNameValid(String name) {
//第一个字符为字母,而后匹配长度为2到9的字母、数字或者下划线
return name.matches("^[a-zA-Z][a-zA-Z0-9_]{2,9}$");
}
//密码验证
public static Boolean passWordValid(String pw) {
//匹配长度为6到10的字母或数字
return pw.matches("^[a-zA-Z0-9]{6,10}$");
}
//手机号验证
public static Boolean mobilePhoneValid(String phone) {
/*第一个字符为1,若第二个字符为3,则第三个字符为0到9的一个数字
若第二个字符为4,则第三个字符为5或7
若第二个字符为5,则第三个字符为0到3,5到9的一个数字
若第二个字符为7,则第三个字符为01678中的一个数字
若第二个字符为8,则第三个字符为0到9的一个数字
后面还有8个数字*/
return phone.matches("^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$");
}
//电话验证
public static Boolean telephoneValid(String tele) {
//3到5位数字 - 7到8为数字 加上( - 1位以上数字)()为可有可无
return tele.matches("\d{3,5}-\d{7,8}(-\d{1,})?");
}
//QQ号验证
public static Boolean qqValid(String qq) {
//第一位字符是1到9,后面的字符为匹配长度是4到14的0到9数字
return qq.matches("[1-9][0-9]{4,14}");
}
//身份证号验证
public static Boolean idValid(String id) {
//15位数字 或者 17位数字加上一个数字或者X或者x
return id.matches("^\d{15}$|^\d{17}(\d|X|x)$");
}
//邮箱验证
public static Boolean emailValid(String email) {
/*一个或多个字母数字或者下划线 + 0个、1个或者多个 小数点或多个字母数字或者下划线
+ 一个@ +一个或多个字母数字下划线 + 0个、1个或者多个 小数点或多个字母数字或者下划线*/
return email.matches("^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$");
}
//网站验证
public static Boolean websiteValid(String ws) {
//(h或者H + 两个 t或者T + p或者P ://)或者(h或者H + 两个 t或者T + p或者P + s或者S://)+有若干个(若干个字母数字-~ 加上 一个.)+若干个字母数字-~/
return ws.matches("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+)[.])+([A-Za-z0-9-~/])+$");
}
//生日验证
public static Boolean birthDateValid(String bd) {
//四个数字 . 两个数字 . 两个数字
//或者四个数字 - 两个数字 - 两个数字
return bd.matches("(\d{4}[.]\d{2}[.]\d{2})|(\d{4}[-]\d{2}[-]\d{2})");
}
//中文名验证
public static Boolean chineseNameValid(String cn) {
//2到5个汉字
return cn.matches("[u4E00-u9FA5]{2,5}");
}
}
PS : 需要提醒的是,使用正则表达式大部分是双反斜杠字符(\),如 一个点:\.。
因为在字符串中需要用来转义一遍字符,再给正则表达式接收再正则转义。如\.在字符串中\转义为,也就是说\.转变成了.,再传入正则表达式变为.。
如果在字符串里只写.的话,第一步就被直接解释为.,之后作为正则表达式被解释时,就变成匹配任意字符了。总结:也就是说,不仅字符串需要转义,正则表达式也需要转义,如 d,有两道转义,所以需要两个。