平时用得少,遇到就得到处找。这里总结一下用法,方便复查
描述了字符串的模式匹配,可用于检索、替换、截取符合模式(规则)的串
\
转义\
要用 \\
,Java匹配路径用到正则,那么地址写法有两种: C:\\dir\\xxx.txt
C:/dir/xxx.txt
\
,Linux用 /
,为了跨平台性推荐使用 /
来写路径\r\n
\n
\r
字符 | 描述 |
---|---|
. | 除换行符 \n之外的任意单字符 |
| | 或 |
\n | 换行符 |
\t | 回车符 |
\d | 数字(digit) |
\D | 除了数字 |
\w | 单词(word),数字,大小写字母,下划线 |
\W | 非单词 |
\s | 空白符(空格,制表符,换页符等) |
\S | 非空白符 |
字符 | 描述 |
---|---|
* | 0或多次 |
+ | 1或多次 |
? | 0或一次 |
{n} | 出现几次 |
{n, } | 至少几次 |
{n,m} | 出现n~m次 |
字符 | 描述 |
---|---|
^ | 开始 |
$ | 结束 |
\b | 单词边界(字与空格间的位置) |
\B | 非单词边界 |
字符 | 描述 |
---|---|
() | 标记子表达式 |
[]
仅仅匹配里面的其中的一个[^0-9]
,表示不匹配数字正则表达式从左到右进行计算,并遵循优先级顺序,下表优先级从高到低
运算符 | 描述 |
---|---|
\ | 转义符 |
()、[] | 圆括号、方括号 |
*、+、?、 {n,m} | 限定符 |
^、$、\num | 定位符、分组编号 |
| | 替换 |
修饰符 | 描述 |
---|---|
i | ignore:大小写不敏感 |
g | global:全局匹配 |
m | multiline:多行匹配,^$会匹配新行符 |
s | single:单行匹配,.会匹配新行符 |
()
可将括号内容看成一个整体进行匹配
(abc+),表示:abc出现1或多次
使用分支时要用括号包裹
a(b | c | d),表示:ab、ac、ad的其中一个
字符串:2020-11-07
模式串:(\d{4})-(\d{2})-(\d{2})
不需要分组引用:(?:\d{4})-(\d{2})-(\d{2}),引用需要缓存降低了速度
引用会把匹配到的组按编号存入缓存,0编号表示整体,后面依次是匹配的内容,使用\n来访问分组:
贪婪是尽可能匹配多的字符,而惰性则是尽可能匹配少的字符(后面加 ? 实现惰性)
字符串:<h1>This is H1</h1>
贪婪模式串:<.+>
惰性模式串:<.+?>
模式串中:<
匹配该字符,.
匹配任意非换行字符,+
匹配1或多次前置字符直到换行,>
匹配该字符,?
表示惰性
贪婪流程:
<
匹配字符串的第一个<
.
一直匹配前面所有字符,直到最后的换行匹配失败>
,这时会进行回溯,即</h1>的>会被匹配到即立刻急切返回
惰性流程:
<
匹配字符串的第一个<
.
匹配h,因为是惰性,所以匹配了.
就开启匹配>
,尽可能返回少的字符>
匹配1失败,就会进行后移
,用.
继续匹配后面的1,然后重复上面一步<h1>
java.util.regex 包主要包括以下三个类:
public static void main(String[] args) throws InterruptedException {
String str = "123456789"; // 字符串
String reg = "\\d+"; // 模式串
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(str);
boolean b = matcher.matches(); // true
}
public static void main(String[] args) throws InterruptedException {
String str = "020-123456"; // 字符串
String reg = "(\\d{3})-(\\d{6})"; // 模式串
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(str);
if(matcher.find()){
System.out.println(matcher.group(0)); // 020-123456
System.out.println(matcher.group(1)); // 020
System.out.println(matcher.group(2)); // 123456
}
}
public static void main(String[] args) throws InterruptedException {
String str = "The dog is mine which dog is playing"; // 字符串
String reg = "dog"; // 模式串
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(str);
String strNew = matcher.replaceAll("cat");
System.out.println(strNew); // "The cat is mine which cat is playing"
}
public static void main(String[] args) throws InterruptedException {
String str = "123456789"; // 字符串
String reg = "\\d+"; // 模式串
boolean matches = str.matches(reg);
System.out.println(matches); // true
}
参考: