【Java】正则表达式

使用正则表达式可以方便的对数据进行匹配,还可以执行更加复杂的字符串验证、拆分、替换功能。

常用的正则规范的定义

正则表达式(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,有两道转义,所以需要两个。

原文地址:https://www.cnblogs.com/blknemo/p/10034890.html