单字符匹配规则
正则表达式 | 规则 | 可以匹配 |
---|---|---|
A | 指定字符 | A |
\u548c | 指定Unicode字符 | 和 |
. | 任意字符 | a,b,_,$,# |
\d | 数字0~9 | 0 ~ 9 |
\D | 非数字 | 除数字外 |
\w | 字母、数字和下划线 | a~ z, A~ Z, 0~9, _ |
\W | 非\w | $, &, 中 |
\s | 空格、Tab键 | 空格,Tab |
\S | 非\s | 字母,数字,下划线,中文,&等 |
多字符匹配规则
正则表达式 | 规则 | 可以匹配 |
---|---|---|
A* | 任意个数的该字符 | 空,A,AA,AAAAAA… |
A+ | 至少一个该字符 | A,AA,AAAAAA… |
A? | 0或1个该字符 | 空,A |
A{3} | 指定个数的字符(n) | AAA |
A{2,3} | 指定范围个数字符 | AA, AAA |
A{2,} | 至少几个字符 | AA, AAAA, AAAA… |
A{0,3} | 最多几个字符 | 空,A, AA,AAA |
复杂匹配规则
正则表达式 | 规则 | 可以匹配 |
---|---|---|
^ | 开头 | 字符串开头 |
$ | 结尾 | 字符串结尾 |
[ABC] | […]中括号内任意单字符 | A, B,C |
[A-C0-2xyz] | 指定范围的字符 | A, B,C,0, 1,2,x, y,z |
[^A-C] | 指定范围外任意字符 | D, E |
AB|CD|EF | 或的关系 | AB, CD, EF |
(AB|CD|EF) | ()起到分组和子串作用,属于分组匹配用 | AB, CD, EF |
(\d+)(0*) | 贪婪匹配,\d+会匹配尽可能多的字符,譬如12300/10100/112,第二组0*匹配会为空 | 第一组会匹配到12300, 10100, 112 |
(\d+?)(0*) | 非贪婪匹配,\d+?会匹配尽可少的字符,譬如12300/10100/112,第一组不会匹配后面的0,第二组匹配后面的0,类似后面的规则优先 | 第一组只匹配到123, 101,112 |
非贪婪匹配
如上已介绍,正则表达式匹配默认使用贪婪匹配,可以使用 ? 表示对某一规则进行非贪婪匹配。
看下正则表达式 (\d+)(0*),分组去匹配10100得到的结果将是:第一组10100,第二组空,就是因为贪婪匹配下,第一组去尽可能多的匹配了。如果写成==(\d+?)(0*)== ,则结果将是第一组101,第二组00
再来看这个正则表达式 (\d??)(6*) ,注意 \d? 表示匹配0个或1个数字,后面第二个 ? 表示非贪婪匹配,因此,给定字符串"666666",匹配到的两个子串分别是"“和"666666”,因为对于 \d? 来说,可以匹配1个6,也可以匹配0个6,但是因为后面的 ? 表示非贪婪匹配,它就会尽可能少的匹配,结果是匹配了0个6
注意区分 ? 的含义:\d??
搜索、分割、替换
分割
Java中常使用String.split()方法传入的正是正则表达式,
“a b c”.split("\s"); // { “a”, “b”, “c” }
“a b c”.split("\s"); // { “a”, “b”, “”, “c” }
“a, b ;; c”.split("[\,\;\s]+"); // { “a”, “b”, “c” }
如果我们想让用户输入一组标签,然后把标签提取出来,因为用户的输入往往是不规范的,这时,使用合适的正则表达式,就可以消除多个空格、混合,和;这些不规范的输入,直接提取出规范的字符串。
搜索
public class Main {
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
Pattern p = Pattern.compile("\\wo\\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}
}
}
结果:
row
fox
dog
我们获取到Matcher对象后,不需要调用matches()方法(因为匹配整个串肯定返回false),而是反复调用find()方法,在整个串中搜索能匹配上\wo\w规则的子串,并打印出来。这种方式比String.indexOf()要灵活得多,因为我们搜索的规则是3个字符:中间必须是o,前后两个必须是字符[A-Za-z0-9_]。[^1]
替换
使用正则表达式替换字符串可以直接调用String.replaceAll(),它的第一个参数是正则表达式,第二个参数是待替换的字符串,
String r = s.replaceAll("需替换字段", " 新字段 ");
反向引用
常常为某些字段前后添加一些新的内容,其使用方式与替换基本一致,
String r = s.replaceAll("匹配字段", " <b> $1</b> ");
$1 就指代匹配的字段,该结果会在前后加上标签<b>