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

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

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

常用正则表达式

可以在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.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 正则表达式-字符类

  • 语法示例:
  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.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.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.5 忽略大小写的写法

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

1.6 贪婪爬取和非贪婪爬取

只写+和表示贪婪匹配,如果在+和后面加问号表示非贪婪爬取
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据

举例:
如果获取数据:ab+
贪婪爬取获取结果:abbbbbbbbbbbb
非贪婪爬取获取结果:ab

代码示例:

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.7 String的split方法中使用正则表达式

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

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

    /*
                有一段字符串:小诗诗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.8 String类的replaceAll方法中使用正则表达式

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

    public String replaceAll(String regex,String newStr):

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

public String replaceAll(String regex,String newStr)
//参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。
//通俗的讲,就是从开始遍历字符串,把符合正则表达式的部分字符,替换成newStr部分指定的字符,生成一个新的字符串
  • 代码示例:
/*
            有一段字符串:小诗诗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.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.10 分组练习

需求:

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

​ 替换为:我要学编程

String str = "我要学学编编编编程程程程程程";

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

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));

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值