快速了解正则表达式

一.简介

1.什么是正则表达式

    正则表达式是一个强大的字符串处理工具,可对字符串进行查找,提取,分割,替换等操作。
    正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。

2.用途

    1. 验证邮箱
    2.识别手机号银行卡号
    3 .互联网网络爬虫
    ……

二.语法

1.基本字符

字符 解释
x 字符x(x可代表任何合法字符)
$ 匹配输入字符串结尾的位置
^ 匹配输入字符串开始的位置。
() 标记子表达式的开始和结束位置
* 零次或多次匹配前面的字符或子表达式。
+ 一次或多次匹配前面的字符或子表达式。
? 零次或一次匹配前面的字符或子表达式。
. 匹配除"\r\n"之外的任何单个字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。
\s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何可见字符。等价于[^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_ ]”。
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)
\B 匹配非单词边界。
\A 输入的开头
\G 前一个匹配的结尾

2.三种模式

Greedy(贪婪模式):最大匹配

        尽可能多的匹配字符。 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的。

Reluctant(懒惰模式):最小匹配

        它只会匹配最少的字符。在 Reluctant 的模式下,只要匹配成功,就不再继续尝试匹配更大范围的内容

Possessive(占有模式):完全匹配

        Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范围。
        贪婪模式与侵占模式的比较

正则:\w+[a-z]与\w++[a-z]
目标串:232hjdhfd7474$
分析:①\w+[a-z]:\w+属于贪婪模式,会一次性吃掉它所能吃掉的所有的字符,也就是子串232hjdhfd7474,此时[a-z]不能够找到匹配了,故\w+匹配的串会吐出一个字符4,但此时还是得不到匹配。反复的这样吐出回退,直到吐出字符d时,此时[a-z]能够匹配h,所以这时正则表达式会返回一次成功的匹配结果,为232hjdhfd
②\w++[a-z]:\w++属于侵占模式,它会一次性吃掉它所能够吃掉的所有字符,即子串232hjdhfd7474,而且不留给其他部分使用,故不会回退。此时[a-z]不能够找到匹配,所以此次匹配失败。在余下的子串中也找不到能匹配成功的子串。所以整个正则表达式是找不到匹配结果的!

贪婪模式 懒惰模式 占有模式 说明
X? X?? X?+ X出现0次或一次
X* X*? X*+ X出现零次或多次
X+ X+? X++ X出现一次或多次
X{n} X{n}? X{n}+ X出现n次
X{n,} X{n,}? X{n,}+ X最少出现n次
X{n,m} X{n,m}? X{n,m}+ X最少出现n次最多出现m次

3.捕获分组

概念:其实就是一个括号内的内容。 如 “(\d)\d” 而"(\d)" 这就是一个捕获分组,可以对捕获分组进行 后向引用 (如果后而有相同的内容则可以直接引用前面定义的捕获组,以简化表达式) 如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用
        如 “zery zery” 正则 \b(\w+)\b\s\1\b 所以这里的"\1"所捕获到的字符也是 与(\w+)一样的"zery",为了让组名更有意义,组名是可以自定义名字的
        “\b(?\w+)\b\s\k\b” 用"?"就可以自定义组名了而要后向引用组时要记得写成 “\k”;自定义组名后,捕获组中匹配到的值就会保存在定义的组名里。
这里可参考https://blog.csdn.net/xufox/article/details/80803482

三.简单使用

java提供Pattern,Matcher两个类用于提供正则表达式的支持简单使用如下

 String str2 = "To be or not to be,this is a question";
 Matcher m1 = Pattern.compile("\\w+").matcher(str2);
 while(m1.find()){
    
    	//如果正则表达式中包含与目标字符串匹配的子串,返回true
    System.out.println(m1.group()+"起始位置"+m1.start()+"结束位置"+m1.end());
    }
 Matcher m2 = Pattern.compile("(t|b)\\w*").matcher(str2);
   while(m2.find()){
    
    
      System.out.println(m2.replaceAll("girl"));          //用所给字符串替换原字符串
   }
        

String类的matches(),replaceAll(),replaceFirst(),split(),都依赖正则表达式支持

String str = "To be or not to be,this is a question";
        String s = "b\\w*";
        boolean b1 = str.matches(s);     //判断该字符串是否匹配指定的正则表达式
        String str1 = str.replaceAll(s,"haha");       //将匹配的子串替换掉
        String s1 = " ";
        String[] arr  = str.split(s1);      //以s1为分隔符做分割

猜你喜欢

转载自blog.csdn.net/haazzz/article/details/106811021