• 【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,有两道转义,所以需要两个。

  • 相关阅读:
    高负载的Lamp架构 转自:http://www.litrin.net/2011/04/20/%E9%AB%98%E8%B4%9F%E8%BD%BD%E7%9A%84lamp%E6%9E%B6%E6%9E%84/
    面向对象设计的基本原则
    [Tip: bat] About "%~dp0"
    [Tip: c# override]
    Where partial types fit in
    Further Overrideable things besides Methods
    [Tip]单位换算
    重构代码解决问题的基本思路
    随想编程之道
    VS快捷键
  • 原文地址:https://www.cnblogs.com/blknemo/p/10034890.html
Copyright © 2020-2023  润新知