美文网首页
31.正则表达式

31.正则表达式

作者: 每天起床都想摆 | 来源:发表于2022-02-17 23:16 被阅读0次

    正则表达式

    正则表达式概述

    • 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性

      数据格式校验:例如用户注册设定密码时,规定必须使用数字和大小写字母组合

    • 测试案例:

      • 需求:假如现在要求校验一个qq号码是否正确,6位及20位之内,必须全部是数字

        package com.java.regex;
        
        public class RegexDemo {
            public static void main(String[] args) {
                System.out.println(check("12312311424124"));
                System.out.println(check("q34eqd2342fw3"));
        
                System.out.println(checkQQ("qwe32e1edewd2e"));
                System.out.println(checkQQ("12312341"));
            }
        
            public static boolean checkQQ(String qq) {          // 正则表达式被封装成一个方法
                return qq != null && qq.matches("\\d{6,20}");
            }
        
            public static boolean check(String qq) {
                if (qq == null || qq.length() > 20 || qq.length() < 6) {
                    return false;
                }
        
                for (int i = 0; i < qq.length(); i++) {
                    // 获取每位字符
                    char ch = qq.charAt(i);
        
                    if (ch < '0' || ch > '9') {
                        return false;
                    }
                }
        
                return true;
            }
        }
        
        

    正则表达式匹配规则

    相关规则可在JDK中搜索Pattern

    • 字符类(默认匹配一个字符)

      规则 含义
      [abc] 只能是a或b或c
      [^abc] 除了a,b,c的任意字符
      [a-zA-Z] a到z和A到Z(全体大小写字母)
      [a-d[m-p]] a到d,或m到p(取并集)
      [a-z&&[def]] 两边取交集得d或e或f
      [a-z&&[^bc] a到z中除去b和c
      [a-z&&[^m-p]] a到z中除去m到p
    • 预定义的字符类(默认匹配一个字符)

      规则 含义&示例
      . 匹配任意字符
      \d 匹配一个数字:[0-9]
      \D 非数字:[0-9]
      \s 一个空白字符:[\t\n\x0B\f\r]
      \S 非空白字符:[^\s]
      \w [a-zA-Z_0-9]:英文,数字,下划线
      \W [^\w]一个非英文数字下划线字符
    • 贪婪的量词(配合匹配多个字符)

      规则 含义
      X? X,一次或根本不匹配
      X* X,零次或多次
      X+ X,至少一次或多次
      X{n} X,正好n次
      X{n,} X,至少n次
      X{n,m} X,至少n且不超过m次
    • 字符串对象提供了匹配正则表达式规则的API:

      public boolean matches(String regex); // 判断是否匹配正则表达式,匹配返回true,反之返回false 
      
      System.out.println("a".matches("[abc]")); //true
      System.out.println("z".matches("[abc]")); //false
      System.out.println("ab".matches("[abc]"));    //false
      System.out.println("ab".matches("[abc]+"));   //true
      
    • 测试代码:

      package com.java.regex;
      
      /**
       * 正则表达式的规则
       */
      public class RegexDemo02 {
          public static void main(String[] args) {
              //public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
              // 只能是 a  b  c
              System.out.println("a".matches("[abc]")); // true
              System.out.println("z".matches("[abc]")); // false
              System.out.println("---------------------------------");
      
              // 不能出现a  b  c
              System.out.println("a".matches("[^abc]")); // false
              System.out.println("z".matches("[^abc]")); // true
              System.out.println("---------------------------------");
      
              System.out.println("a".matches("\\d")); // false
              System.out.println("3".matches("\\d")); // true
              System.out.println("333".matches("\\d")); // false
              System.out.println("z".matches("\\w")); // true
              System.out.println("2".matches("\\w")); // true
              System.out.println("21".matches("\\w")); // false
              System.out.println("你".matches("\\w")); // false
              System.out.println("你".matches("\\W")); // true
              System.out.println("---------------------------------");
              //  以上正则匹配只能校验单个字符。
      
              // 校验密码
              // 必须是数字 字母 下划线 至少 6位
              System.out.println("2442fsfsf".matches("\\w{6,}")); // true
              System.out.println("244f".matches("\\w{6,}"));  // false
              System.out.println("---------------------------------");
      
              // 验证码 必须是数字和字符  必须是4位
              System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));
              System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));
              
              System.out.println("23dF".matches("[\\w&&[^_]]{4}"));
              System.out.println("23_F".matches("[\\w&&[^_]]{4}"));
      
          }
      }
      
      

    正则表达式常见案例

    • 需求

      • 输入手机号码,验证格式直到正确为止
      • 输入邮箱号码,验证格式直到正确为止
      • 输入电话号码,验证格式直到正确为止
    • 分析

      • 定义方法,接收用户的数据,使用正则表达式完成校验,并给出提示
    • 测试代码

      package com.java.regex;
      
      import java.util.Scanner;
      
      public class RegexDemo03 {
          public static void main(String[] args) {
              Scanner in = new Scanner(System.in);
              checkPhone(in);
              checkEmail(in);
              checkTel(in);
          }
      
          public static void checkPhone(Scanner sc) {
              System.out.println("请输入手机号码:");
              while (true) {
                  String phone = sc.next();
                  if (phone.matches("1[3-9]\\d{9}")) {
                      System.out.println("手机号码格式正确!");
                      break;
                  } else {
                      System.out.println("格式有误,请重新输入!");
                  }
              }
          }
      
          public static void checkEmail(Scanner sc) {
              System.out.println("请输入邮箱号码:");
              while (true) {
                  String email = sc.next();
                  if (email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")) {
                      System.out.println("邮箱号码格式正确!");
                      break;
                  } else {
                      System.out.println("格式有误,请重新输入!");
                  }
              }
          }
      
          public static void checkTel(Scanner sc) {
              System.out.println("请输入座机号码:");
              while (true) {
                  String tel = sc.next();
                  if (tel.matches("0\\d{2,9}-?\\d{5,20}")) {
                      System.out.println("座机号码格式正确!");
                      break;
                  } else {
                      System.out.println("格式有误,请重新输入!");
                  }
              }
          }
      }
      
      

    正则表达式在方法中的应用

    方法名 说明
    public String replaceAll(String regex, String newStr) 按照正则表达式匹配的内容进行替换
    public String[] split(String regex) 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
    package com.java.regex;
    
    public class RegexDemo04 {
        public static void main(String[] args) {
            String names = "路飞dhdfhdf342娜美43fdffdfbjdfaf索隆";
    
            String[] arrs = names.split("\\w+");
            for (int i = 0; i < arrs.length; i++) {
                System.out.println(arrs[i]);
            }
    
            String names2 = names.replaceAll("\\w+", "  ");
            System.out.println(names2);
        }
    }
    

    正则表达式爬取信息

    使用正则表达式从字符串中提取信息

    package com.java.regex;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 正则表达式爬取信息中的内容。
     */
    public class RegexDemo05 {
        public static void main(String[] args) {
            String rs = "学习JavaEE,电话020-43422424,dadqfafrwQWD或者联系邮箱" +
                    "itcast@itcast.cn,电话18762832633,0203232323" +
                    "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
    
            // 需求:从上面的内容中爬取出 电话号码和邮箱。
            // 1、定义爬取规则,字符串形式
            String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})" +
                    "|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";
    
            // 2、把这个爬取规则编译成匹配对象。
            Pattern pattern = Pattern.compile(regex);
    
            // 3、得到一个内容匹配器对象
            Matcher matcher = pattern.matcher(rs);
    
            // 4、查找
            while (matcher.find()) {
                String rs1 = matcher.group();
                System.out.println(rs1);
            }
    
        }
    }
    

    相关文章

      网友评论

          本文标题:31.正则表达式

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