正则表达式

mario 2020年09月11日 88次浏览

前言

最近由于写的正则表达式太差,导致回溯极长时间,于是我痛定思痛,决定系统学习下正则表达式。
通常我们使用正则表达式查找或替换符合某个模式的文本,比如有的小伙伴抓取网页发现链接大多是采用相对路径:
image.png
这时候可能需要将它转化为绝对路径:

String domain = "https://www.guancha.cn/";//根地址
String url = "/lusongxiong/2020_09_12_564863.shtml";//相对地址
url = url.replaceFirst("^/", domain);//https://www.guancha.cn/lusongxiong/2020_09_12_564863.shtml

本文将从概念、规则两个方面学习正则表达式,并且介绍如何在Java中使用正则表达式。
在学习过程中,在线正则表达式测试网站给了我很大的帮助。

前置概念

正则表达式主要由元字符(\d,\s等)和限定修饰符(*,+,?等)组成,元字符被限定修饰符限定,如\d?匹配一个或零个数字。普通字符可以看作一种特殊的元字符,如aab?匹配aa或aab。

正则表达式规则

1. 任意一个字符代表匹配任意对应的字符

例如a匹配a,1匹配1,-匹配- 。

2. []代表匹配其中任意字符

如[abc]匹配a或b或c。

3. - , ^ , . 在[]内外的含义不同

  • -在外时,只匹配-,如在内,表示匹配一个范围,如[a-z]表示匹配a到z的任意小写字母,[0-9]匹配任意十个数字中的一个;
  • ^在外时表示匹配开头,如^a匹配abc,不匹配bac,如果在中括号里面,表示除了该字符之外的任意字符,如[^123]匹配出去123之外的任意字符;
  • .在外时,匹配任意字符,在内只匹配它本身。

4. 常用元字符

字符说明
\d数字
\D非数字
\s任意空白字符,如空格回车等,等价于[\f\n\r\t\v]
\S任意非空白字符,与\s相反
\w字母,数字,下划线,等价于[a-zA-Z_]
\W除字母、数字、下划线之外任意字符

5. 常用限定符

限定符说明
?出现1次或0次
+出现1次或多次
*出现任意次
出现n次
{n,m}出现[n,m]次
{n,}至少出现n次

6. X|Y代表匹配X或Y

如foot|d匹配food或foot

7. 使用\匹配特殊字符

如readme\.md匹配readme.md

8. (X)子表达式,将X看作一个整体

Java中使用正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegTest {
    public static void main(String[] args) {

        //替换
        String str1 = "A great man is immortal";
        String[] str11 = str1.split("\\s");
        for(String tmp: str11){ //Agreatmanisimmortal
            System.out.print(tmp);
        }

        //匹配
        String reg1 = "^[1][3,4,5,7,8][0-9]{9}$";
        Pattern p = Pattern.compile(reg1);
        Matcher m = p.matcher("17674663791");
        System.out.println(m.find()? "√":"×"); //√

        //查找
        String reg2 = "[a-zA-Z]+"; //查找出现的英文
        Pattern p1 = Pattern.compile(reg2);
        Matcher m1 = p1.matcher("4123412351a4123great90890man909is78immortal");
        while(m1.find()){ //a great man is immortal
            System.out.print(m1.group(0) + " ");
        }
        
    }
}

参考