前言
最近由于写的正则表达式太差,导致回溯极长时间,于是我痛定思痛,决定系统学习下正则表达式。
通常我们使用正则表达式查找或替换符合某个模式的文本,比如有的小伙伴抓取网页发现链接大多是采用相对路径:
这时候可能需要将它转化为绝对路径:
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) + " ");
}
}
}
参考
- Java中正则表达式
- Java正则表达式 | 菜鸟教程
- 《Java从入门到精通》(第五版)