美文网首页
正则表达式

正则表达式

作者: luoqiang108 | 来源:发表于2018-02-26 16:45 被阅读0次

    正则表达式

    正则表达式的作用是规定一个字符串的格式,正则表达式使用一些特殊的字符组合来描述格式。

    正则表达式 说明
    [abc] a、b、c中任意一个字符
    [^abc] 除了a、b、c的任意字符
    [a-z] a、b、c、......、z中任意一个字符
    [a-zA-Z0-9] az、AZ、0~9中任意一个字符
    [a-z&&[^bc]] a~z中除了b和c以外的任意一个字符,其中&&表示“与”的关系
    . 任意一个字符
    \d 任意一个数字字符,相对于[0-9]
    \D 任意一个非数字字符,相对于[^0-9]
    \s 空白字符,相对于[\t\n\x0B\f\r]
    \S 非空白字符,相对于[^\s]
    \w 任意一个单词字符,相对于[a-zA-Z_0-9]
    \W 任意一个非单词字符,相对于[^\w]
    X? 表示0个或1个X
    X* 表示0个或任意多个X
    X+ 表示0个到任意多个X(大于等于1个X)
    X{n} 表示n个X
    X{n,} 表示n到任意多个个X(大于等于n个X)
    X{n,m} 表示n到m个X(大于等于n个且小于m个X)
    • 正则表达式中:
      []:描述一个字符[a-z]:是小写字母
      ():将一组字符看为一个整体
      |:描述或关系
      +:表示前面的内容出现1到多次
      *:表示前面的内容出现0到多次
      ?:表示前面的内容出现0到1次
    • 正则表达式的首尾
      ^:表示字符串必须以其后面约束的内容开始
      $:表示字符串必须以其前面约束的内容结尾
      若正则表达式不书写^或者$,正则表达式代表匹配部分内容,都加上则表示全匹配。
    • +的作用代表前面描述的内容出现1次以上等同于{1,}
    • 实际中在正则表达式中有特殊含义的字符要用\转义,如下面的"."需要用"\."来表示
      eg:描述邮箱格式(123ab_AB@qq.com):[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.com|\.cn|\.net)
    • String的split方法是根据给定[正则表达式]的匹配拆分此字符串,所以对于正则表达式中有特殊含义的字符要用\转义。如String.split("\\.");
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    /**
     * 正则表达式
     */
    public class Regex {
        public static void main(String[] args){
            /**
             * Pattern的作用是描述正则表达式的格式支持
             * 使用静态方法compile注册正则表达式生成实例
             */
            /**
             * 使用java的字符串去描述正则表达式的时候,会出现一个冲突
             * 如何描述正则表达式的"."。
             *起因:
             *  在正则表达式中我们想描述一个".",但"."在正则表达式中有特殊的含义,
             *  它代表任意字符,所以我们在正则表达式中想描述"."的愿意要写成"\."。
             *  但是我们用java的字符串去描述正则表达式的时候,因为"."在java字符串
             *  中没有特殊的含义,所以java认为我们书写String s = "\.";是有语法错误的,
             *  因为"."不需要转义。这就产生了冲突。
             *目的:
             *  我们实际的目的很简单,就是要让java的字符串描述"\."
             *  所以,那么在java中"\"是有特殊含义的,代表转义字符
             *  我们只需要将"\"转义为单纯的斜杠"\\"即可描述"\."了。
             *  所以我们用java描述"\."的正确写法是String s = "\\.";
             */
            //定义邮箱正则表达式
            String regMailStr = "^[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.com|\\.cn|\\.net)+$";
            //定义手机号码正则表达式
            String regPhoneStr = "^(\\+86)?\\d{11}$";
            //注册正则表达式
            Pattern pattern = Pattern.compile(regMailStr);
            String mailStr="@abc_defghi123@yahoo.com.cn";
            //匹配字符串,返回描述匹配结果的Matcher实例
            Matcher matcher = pattern.matcher(mailStr);
            //通过调用Matcher的find方法得知是否匹配成功
            if (matcher.find()){
                System.out.println("邮箱格式正确");
            }else {
                System.out.println("邮箱格式错误");//邮箱格式错误
            }
        }
    }
    

    实例

        String numRule = "[1][3578]\\d{9}";//"[1]"代表第1位为数字1,"[3578]"代表第二位可以为3、5、7、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
            String phone = "13879668668";
            if (phone.matches(numRule)) { //告知此字符串是否匹配给定的正则表达式
                System.out.println("手机号码符合要求");//手机号码符合要求
            } else {
                System.out.println("手机号码不符合要求");
            }
            //下面正则的含义:必须以http://或https://开头,中间[a-zA-Z0-9.]出现一到多次,之后再拼接:
            //最后以0~9的数字出现0到多次结尾
            String rule = "^(http://|https://)[a-zA-Z0-9.]+:\\d*$";
            //注册正则表达式
            Pattern pattern = Pattern.compile(rule);
            //匹配字符串,返回描述匹配结果的Matcher实例
            Matcher matcher = pattern.matcher("http://www.baidu.com:");
            //通过调用Matcher的find方法得知是否匹配成功
            if (matcher.find()) {
                System.out.println("域名符合要求");//域名符合要求
            }else{
                System.out.println("域名不符合要求");
            }
    

    工具类

    import android.text.TextUtils;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexUtil {
        /**
         * 验证手机号是否为正确手机号
         *
         * @param mobile 手机号
         * @return
         */
        public static boolean isMobilePhoneNumber(String mobile) {
            if (TextUtils.isEmpty(mobile)) {
                return false;
            }
            //Pattern p = Pattern.compile("^[1][3,4,5,7,8,9][0-9]{9}$");
            Pattern p = Pattern
                    .compile("^(13[0-9]|15[012356789]|166|19[89]|17[3678]|18[0-9]|14[57])[0-9]{8}$");
            Matcher m = p.matcher(mobile);
            m.find();
            return m.matches();
        }
    
        /**
         * 身份证是否合法
         *
         * @return
         */
        public static boolean isIdCard(String idCard) {
            boolean result = false;
            if (!TextUtils.isEmpty(idCard)) {
                String IDCardRegex = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x|Y|y)$)";
                result = idCard.matches(IDCardRegex);
            }
            return result;
        }
    
        /**
         * 检测邮箱地址是否合法
         *
         * @param email
         * @return true合法 false不合法
         */
        public static boolean isEmail(String email) {
            boolean flag = false;
            try {
                String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
                Pattern regex = Pattern.compile(check);
                Matcher matcher = regex.matcher(email);
                flag = matcher.matches();
            } catch (Exception e) {
                flag = false;
            }
            return flag;
        }
    
        /**
         * 纳税人识别号是否合法
         *
         * @param payNumber
         * @return
         */
        public static boolean isPayNumer(String payNumber) {
            if (TextUtils.isEmpty(payNumber)) {
                return false;
            }
            Pattern p = Pattern
                    .compile("(^[A-Za-z0-9]{15}$)|(^[A-Za-z0-9]{18}$)|^[A-Za-z0-9]{20}$");
            Matcher m = p.matcher(payNumber);
            return m.matches();
        }
    }
    

    相关文章

      网友评论

          本文标题:正则表达式

          本文链接:https://www.haomeiwen.com/subject/pnpyxftx.html