• 正则表达式相关知识总结记录(日常开发)


    正则表达式相关知识总结记录(日常开发)

    • 首先,直接给出日常开发最常用的一些正则表达式的判断!

    常用正则表达式

    可以在idea中下载any-rule插件进行快捷使用

    //第一部分:1 表示手机号码只能以1开头
    //第二部分:[3-9] 表示手机号码第二位只能是3-9之间的
    //第三部分:\\d{9} 表示任意数字可以出现9次,也只能出现9次
    * 手机号码:1[3-9]\\d{9}
    
    //一:区号@\\d{2,3}0:表示区号一定是以0开头的; \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次。
    //二:- ?表示次数,日次或一次
    //三:号码 号码的第一位也不能以日开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
    
    * 座机号码:0\\d{2,3}-?[1-9]\\d{4,9}
    //邮箱号码
    //3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
    //思路:在书写邮箱号码正则的时候需要把正确的数据分为三部分
    //第一部分:@的左边 \\w+     任意的字母数字下划线,至少出现一次就可以了
    //第二部分:@ 只能出现一次
    //第三部分:
    //      3.1         .的左边[\\w&&[^_]]{2,6} 任意的字母加数字,总共出现2-6次(此时不能出现下划线)
    //      3.2         . \\.  点符号需要\\进行转义输出
    //      3.3         大写字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
    //      (\\.[a-zA-Z]{2,3}){1,2} ()代表分组,我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
    
    * 邮箱号码:\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}
    
    * 24小时:([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d
    	   ([01]\\d|2[0-3])(:[0-5]\\d){2}
    
    * 用户名:	\\w{4,16}
    
    * 身份证号码,简单校验:
    		[1-9]\\d{16}(\\d|X|x)
    		[1-9]\\d{16}[\\dXx]
    		[1-9]\\d{16}(\\d(?i)X)
    
    * 身份证号码,严格校验:
    		[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9|[12])\\d|3[01])\\d{3}[\\dXx]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    正则表达式

    • 写在前面,正则表达式是通过字符规则+数量词来规定字符串要求格式的一种规范。字符规则部分只针对单个字符
      • 若字符串长度与正则表达式规定字符规则+数量词的长度不同,则直接判断不合规则
      • 若正则表达式没有规定数量词,则默认一个字符规则对应一个字符

    1.1正则表达式-数量词

    • 语法示例:

      前面的X代表一个字符,后面跟着的符号代表出现次数的规则

      1. X? : 0次或1次
      2. X* : 0次到多次
      3. X+ : 1次或多次
      4. X{n} : 恰好n次
      5. X{n,} : 至少n次
      6. X{n,m}: n到m次(n和m都是包含的)
    • 代码示例:

      public class Demo {
      	public static void main(String[] args) {
      		 // 必须是数字 字母 下划线 至少 6位
              System.out.println("2442fsfsf".matches("\\w{6,}"));//true
              System.out.println("244f".matches("\\w{6,}"));//false
              
              // 必须是数字 字母 下划线 至少 6位,最多9位
              System.out.println("2442fsfsf".matches("\\w{6,9}"));//true
      
              // 必须是数字和字符 必须是4位
              System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
              System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false
              System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
              System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
              
            	// 字符0次到多次
              System.out.println("33".matches("\\d?"));//false,0次到1次,所以字符长度不符
              System.out.println("33".matches("\\d+"));//true,1次到多次,两个33都得到判断
              System.out.println("33a".matches("\\w+"));//true
              System.out.println("_33a".matches("\\w*"));//true
              System.out.println("你您".matches("\\W*"));//true
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

    1.2 正则表达式-字符类

    • 语法示例:
    1. [abc]:代表a或者b,或者c字符中的==一个==。
    2. [^abc]:代表除a,b,c以外的任何字符。
    3. [a-z]:代表a-z的所有小写字符中的一个。
    4. [A-Z]:代表A-Z的所有大写字符中的一个。
    5. [0-9]:代表0-9之间的某一个数字字符。
    6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
    7. [a-dm-p] --[a-d[m-p]]:a 到 d 或 m 到 p之间的任意一个字符(两种写法)。
    8. [a-z&&[def]]: a到z和def的交集 —>允许范围:d,e,f
    9. [a-z && [^bc]] — [ad-z]: a到z和非bc的交集(两种写法).
    10. [a-z&&[^m-p]] ----[a-lq-z ]: a到z和除了m到p的交集。
    11. [abc]zz: 代表第一个字符为a,b,c中的一个,==后两个字符必须为zz ==
    12. (\\w[a-zA-Z]{2,3}){1,2} 😦)里表示分组,将两部分作为一组,这一组字符可能出现1到2次
    • 代码示例:
    package com.itheima.a08regexdemo;
    
    public class RegexDemo2 {
        public static void main(String[] args) {
            //public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
            // 只能是a b c
            System.out.println("-----------1-------------");
            System.out.println("a".matches("[abc]")); // true
            System.out.println("z".matches("[abc]")); // false
            System.out.println("aa".matches("[abc]")); // false,因为字符串长度为2,正则为1
    
            // 不能出现a b c
            System.out.println("-----------2-------------");
            System.out.println("a".matches("[^abc]")); // false
            System.out.println("z".matches("[^abc]")); // true
            System.out.println("zz".matches("[^abc]")); //false,因为字符串长度为2,正则为1
            System.out.println("zz".matches("[^abc][^abc]")); //true
    
            // a到zA到Z(包括头尾的范围)
            System.out.println("-----------3-------------");
            System.out.println("a".matches("[a-zA-z]")); // true
            System.out.println("z".matches("[a-zA-z]")); // true
            System.out.println("aa".matches("[a-zA-z]"));//false
            System.out.println("zz".matches("[a-zA-Z]")); //false
            System.out.println("zz".matches("[a-zA-Z][a-zA-Z]")); //true
            System.out.println("0".matches("[a-zA-Z]"));//false
            System.out.println("0".matches("[a-zA-Z0-9]"));//true
    
    
            // [a-d[m-p]] a到d,或m到p
            System.out.println("-----------4-------------");
            System.out.println("a".matches("[a-d[m-p]]"));//true
            System.out.println("d".matches("[a-d[m-p]]")); //true
            System.out.println("m".matches("[a-d[m-p]]")); //true
            System.out.println("p".matches("[a-d[m-p]]")); //true
            System.out.println("e".matches("[a-d[m-p]]")); //false
            System.out.println("0".matches("[a-d[m-p]]")); //false
    
            // [a-z&&[def]] a-z和def的交集。为:d,e,f,这种形式规则,看小规则集范围即可
            System.out.println("----------5------------");
            System.out.println("a".matches("[a-z&[def]]")); //false
            System.out.println("d".matches("[a-z&&[def]]")); //true
            System.out.println("0".matches("[a-z&&[def]]")); //false
    
            // [a-z&&[^bc]] a-z和非bc的交集。(等同于[ad-z])
            System.out.println("-----------6------------_");
            System.out.println("a".matches("[a-z&&[^bc]]"));//true
            System.out.println("b".matches("[a-z&&[^bc]]")); //false
            System.out.println("0".matches("[a-z&&[^bc]]")); //false
    
            // [a-z&&[^m-p]] a到z和除了m到p的交集。(等同于[a-1q-z])
            System.out.println("-----------7-------------");
            System.out.println("a".matches("[a-z&&[^m-p]]")); //true
            System.out.println("m".matches("[a-z&&[^m-p]]")); //false
            System.out.println("0".matches("[a-z&&[^m-p]]")); //false
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    1.3 正则表达式-逻辑运算符

    • 语法示例:
      1. &&:并且
      2. | :或者
      3. \ :转义字符
    • 代码示例:
    public class Demo {
    	public static void main(String[] args) {
    		String str = "had";
    		
    		//1.要求字符串是小写辅音字符开头,后跟ad
    		String regex = "[a-z&&[^aeiou]]ad";
    		System.out.println("1." + str.matches(regex));
    		
    		//2.要求字符串是aeiou中的某个字符开头,后跟ad
    		regex = "[a|e|i|o|u]ad";//这种写法相当于:regex = "[aeiou]ad";
    		System.out.println("2." + str.matches(regex));
            
            //3.此时\表示转义字符,改变了后面那个双引号原本的含义
            //把他变成了一个普普通通的双引号而已。
            System.out.println("\"");
    
            // \表示转义字符
            //两个\的理解方式:前面的\是一个转义字符,改变了后面\原本的含义,把他变成一个普普通通的\而已。
            System.out.println("c:Users\\moon\\IdeaProjects\\basic-code\\myapi\\src\\com\\itheima\\a08regexdemo\\RegexDemo1.java");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.4 正则表达式-预定义字符

    • 语法示例:
      1. “.” : 匹配任何字符。注意:一个点匹配一个字符
      2. “\d”:任何数字[0-9]的简写;
      3. “\D”:任何非数字[^0-9]的简写;
      4. “\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
      5. “\S”: 非空白字符:[^\s] 的简写
      6. “\w”:单词字符:[a-zA-Z_0-9]的简写,a到z,A到Z,下划线,0到9之间的一个字符。
      7. “\W”:非单词字符:[^\w]的简写,是6中单词字符的取反
    • 代码示例:
    public class Demo {
    	public static void main(String[] args) {
            //.表示任意一个字符
            System.out.println("你".matches("..")); //false,因为字符串长度为1,正则为2,长度不符。
            System.out.println("你".matches(".")); //true
            System.out.println("你a".matches(".."));//true
    
            // \\d 表示任意的一个数字
            // \\d只能是任意的一位数字
            // 简单来记:两个\表示一个\
            System.out.println("a".matches("\\d")); // false
            System.out.println("3".matches("\\d")); // true
            System.out.println("333".matches("\\d")); // false,因为字符串长度为1,正则为3,长度不符。
    
            //\\w只能是一位单词字符[a-zA-Z_0-9]
            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
    
            // 必须是数字和字符 必须是4位
            System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
            System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false
            System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
            System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
    		
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    1.5 忽略大小写的写法

    • (?i) :表示忽略后面数据的大小写
    //(?i) :表示忽略后面数据的大小写
    //忽略abc的大小写
    String regex = "(?i)abc";
    //a需要一模一样,忽略bc的大小写
    String regex = "a(?i)bc";
    //只忽略特定字符b的大小写
    String regex = "a((?i)b)c";
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.6 贪婪爬取和非贪婪爬取

    只写+和表示贪婪匹配,如果在+和后面加问号表示非贪婪爬取
    +? 非贪婪匹配
    *? 非贪婪匹配
    贪婪爬取:在爬取数据的时候尽可能的多获取数据
    非贪婪爬取:在爬取数据的时候尽可能的少获取数据
    
    举例:
    如果获取数据:ab+
    贪婪爬取获取结果:abbbbbbbbbbbb
    非贪婪爬取获取结果:ab
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    代码示例:

    public class RegexDemo10 {
        public static void main(String[] args) {
            /*
                只写+和*表示贪婪匹配
                +? 非贪婪匹配
                *? 非贪婪匹配
                贪婪爬取:在爬取数据的时候尽可能的多获取数据
                非贪婪爬取:在爬取数据的时候尽可能的少获取数据
                ab+:
                贪婪爬取:abbbbbbbbbbbb
                非贪婪爬取:ab
            */
            String s = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
                    "经历了很多版木,目前企业中用的最多的是]ava8和]ava11,因为这两个是长期支持版木。" +
                    "下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
    
            String regex = "ab+";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(s);
    
            while (m.find()) {
                System.out.println(m.group());
            }
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    1.7 String的split方法中使用正则表达式

    • String类的split()方法原型:

      public String[] split(String regex)
      //参数regex表示正则表达式。可以将当前字符串中匹配regex正则表达式的符号作为"分隔符"来切割字符串。
      
      • 1
      • 2
    • 代码示例:

      /*
                  有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠
                  要求1:把字符串中三个姓名之间的字母替换为vs
                  要求2:把字符串中的三个姓名切割出来*/
      
      String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";
      
      //细节:
      //方法在底层跟之前一样也会创建文本解析器的对象
      //然后从头开始去读取字符串中的内容,只要有满足的,那么就切割。
      String[] arr = s.split("[\\w&&[^_]]+");//[小诗诗,小丹丹,小惠惠]
      for (int i = 0; i < arr.length; i++) {
          System.out.println(arr[i]);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    1.8 String类的replaceAll方法中使用正则表达式

    • String类的replaceAll()方法原型:

      public String replaceAll(String regex,String newStr):

      通俗的讲,就是从开始遍历字符串,把符合正则表达式的部分字符,替换成newStr部分指定的字符,生成一个新的字符串

    public String replaceAll(String regex,String newStr)
    //参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。
    //通俗的讲,就是从开始遍历字符串,把符合正则表达式的部分字符,替换成newStr部分指定的字符,生成一个新的字符串
    
    • 1
    • 2
    • 3
    • 代码示例:
    /*
                有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠
                要求1:把字符串中三个姓名之间的字母替换为vs
                要求2:把字符串中的三个姓名切割出来*/
    
    String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";
    
    //细节:
    //方法在底层跟之前一样也会创建文本解析器的对象
    //然后从头开始去读取字符串中的内容,只要有满足的,那么就用第一个参数去替换。
    String result1 = s.replaceAll("[\\w&&[^_]]+", "vs");
    //字符串中dqwefqwfqwfwq12312部分字符满足上面"[\\w&&[^_]]+"正则表达式,则把这部分替换成后面指定的“vs”字符,生成新的字符串---“小诗诗vs12312小丹丹vs小惠惠”。
    
    System.out.println(result1);//小诗诗vs12312小丹丹vs小惠惠
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.9 正则表达式-分组括号( )

    细节:如何识别组号?

    只看左括号,不看有括号,按照左括号的顺序,从左往右,依次为第一组,第二组,第三组等等

    //需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
    //举例: a123a b456b 17891 &abc& a123b(false)
    //    \\1---\\组号:表示把第X组的内容再出来用一次
    String regex1 = "(.).+\\1";
    System.out.println("a123a".matches(regex1));
    System.out.println("b456b".matches(regex1));
    System.out.println("a123b".matches(regex1));
    System.out.println("--------------------------");
    
    
    //需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
    //举例: abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
    String regex2 = "(.+).+\\1";
    System.out.println("abc123abc".matches(regex2));
    System.out.println("abc123abd".matches(regex2));
    System.out.println("---------------------");
    
    //需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
    //举例: aaa123aaa bbb456bbb 111789111 &&abc&&
    //    (.):把首字母看做一组
    //    \\2:把首字母拿出来再次使用
    //    *:作用于\\2,表示后面重复的内容出现零次或多次
    String regex3 = "((.)\\2*).+\\1";
    System.out.println("aaa123aaa".matches(regex3));
    System.out.println("&&abc&&".matches(regex3));
    System.out.println("aaa123aab".matches(regex3));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    1.10 分组练习

    需求:

    ​ 将字符串:我要学学编编编编程程程程程程。

    ​ 替换为:我要学编程

    String str = "我要学学编编编编程程程程程程";
    
    //需求:把重复的内容 替换为 单个的
    //学学                学
    //编编编编            编
    //程程程程程程        程
    //  (.)表示把重复内容的第一个字符看做一组
    //  \\1表示第一字符再次出现
    //  + 至少一次
    //  $1 表示把正则表达式中第一组的内容,再拿出来用
    String result = str.replaceAll("(.)\\1+", "$1");
    System.out.println(result);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.11 非捕获分组

    非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来,不占用括号

    • (? : 正则) :获取所有
    • (? = 正则) :获取前面部分
    • (? !正则) :获取不是指定内容的前面部分
    //身份证号码的简易正则表达式
    //非捕获分组:仅仅是把数据括起来
    //特点:不占用组号
    //这里\\1报错原因:(?:)就是非捕获分组,此时是不占用组号的。
    
    
    //(?:) (?=) (?!)都是非捕获分组//更多的使用第一个
    //String regex1 ="[1-9]\\d{16}(?:\\d|x|x)\\1";
    String regex2 ="[1-9]\\d{16}(\\d Xx)\\1";
    //^([01]\d|2[0-3]):[0-5]\d:[@-5]\d$
    
    System.out.println("41080119930228457x".matches(regex2));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    本笔记基于黑马程序员笔记整理编写,仅供学习参考,谢谢

  • 相关阅读:
    时序数据库-6-[IoTDB]的数据模式
    软文推广中媒体矩阵的优势在哪儿
    ZZCMS201910审计入门和SQL注入
    【前端设计模式】之迭代器模式
    Python的NumPy库(一)基础用法
    Redis夺命十二问,差点没抗住
    SiC MOSFET的短路特性及保护
    计算机网络_计算机的概念、组成、功能、分类
    [附源码]java毕业设计社区新冠疫情防控网站
    【Linux kernel/cpufreq】framework ----cpufreq core(1)
  • 原文地址:https://blog.csdn.net/zhangkai__/article/details/127999265