正则表达式

W3C 正则表达式

普通字符

字母,数字,汉字,下划线,以及没有特殊定义的标点符号。
表达式中普通字符,在匹配一个字符串的时候,匹配与之间相同的一个字符

转义字符

转义字符 \
换行符 \n
制表符 \t
代表反斜杠本身 \\
匹配这些字符本身 \^ \$ \. \( \) \{ \} \? \+ \* \| \[ \]

标注字符集合

注意:\d \w \s大写,与之相反。

  • \d任意一个数字。0~9任意一个。
  • \w任意一个字母,或数字,或下划线,也就是A~Z,a~z,0~9,_中任意一个
  • \s包括空格,制表符,换行符等空白字符的其中任意一个
  • .小数点可以匹配任意一个字符(除了换行符)。如果要匹配包括\n在内的所有字符,一般用[\s\S]

自定义字符集合

[]中括号匹配方法,能够匹配中括号中任意一个字符

  • [ab5@]匹配a,或b,或5@
  • [^abc]匹配abc之外的任意一个字符
  • [f-k]匹配f~k之间的任意一个字母
  • [^A-F0-3]匹配A~F,0-3之外的任意一个字符

正则表达式的特殊符号,如果在中括号中,将失去特殊意义。^尖括号 -减号除外
标注字符集合,除小数点外。如果在中括号中,将匹配该集合。

  • [\d.\-+]将匹配:数字,小数点,减号,加号【这里的\-表示把减号转义了。】

量词

  • {n}匹配重复n次
  • {m,n}最少重复m次,最多重复n次
  • {m,}至少匹配m次
  • ?匹配0次或1次,相当于{0,1}
  • +最少匹配1次,相当于{1,}
  • *不出现或出现任意次,相当于{0,}

注意:没有{,6}这种写法。如果想匹配最多6次,可以使用{n,6}

  1. 贪婪模式默认模式。匹配字符越多越好。

    • \d{3,6}如果一个字符串为95423156545 1234,匹配一个9符合\d,继续往后匹配,匹配5也符合\d,一直匹配到能匹配的最大值,最终匹配6次\d为止,也就是954231。到这里还没结束,因为后面还有数字,还符合匹配条件,同理会匹配56545。同理再匹配1234。所以它会匹配到三个字符串954231 56545 1234
  2. 非贪婪模式在量词后面加上一个?问号。表示匹配字符越少越好。

    • \d{3,6}?如果一个字符串为95423156545 1234,匹配一个9符合\d,继续往后匹配,匹配5也符合\d,当匹配到954就不匹配了,这里954就是匹配到的第一个字符串。同理继续往后匹配,所以它会匹配到四个字符串954 231 565 123

字符边界

下面三个字符是用来判断位置,而不是用来匹配字符的。

  • ^字符串开始的位位置
    • ^aaa匹配aaa开头的字符串
  • $字符串结束的位置
    • abc$匹配abc结尾的字符串
  • \b匹配一个单词边界。匹配这样一个位置:前面字符和后面字符不全是\w。也就是\b前后都是\w就不匹配。
    • abcd\b例如一个字符串是abcd12 abcd123 abcd aa此时的\b前面是d,因为\b前后都是\w就不匹配,也就是说如果此时\b后面是\w就不匹配。
      第一个字符串abcd12这里的\b后面是1,此时两边都是\w不符合。同理abcd123也不符合。第三个abcd是符合的。因为\b后面是空白符号,不属于\w。所以匹配的最终结果高亮显示:abcd12 abcd123 abcd aa

匹配模式

1
2
3
4
5
6
7
8
9
10
11
+ IGNORECASE 忽略大小写模式
匹配时忽略大小写。默认情况下是区分大小写的。
+ SINGLELINE 单行模式
整个文本看作一个字符串,只有一个开头,一个结尾。
使小数点`.`可以匹配包含换行符在内的任意字符。
* 把所有的行合成一行,每一行与下一行相当于用`\n`连接。此时的小数点`.`可以匹配任意字符。
+ MULTILINE 多行模式
每行都是一个字符串,都有开头和结尾。
在指定了`MULTILINE`之后,如果需要仅匹配字符串开始和结尾的位置,可以使用`\A`和`\Z`
* 此时的`^a`匹配不同于单行模式,它会匹配每一行a开头的字符串。同理`a$`会匹配每一行的a结尾的字符串。
* 多行模式下的`\Aa` `a\Z`等同于单行模式下的`^a` `a$`返回的内容

选择符和捕获组组

1
2
3
4
5
6
7
8
9
10
`|`分支结构
+ 匹配左边或右边。`abc|def`匹配字符串`abc`或`def`
`()`捕获组
+ 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰。
`(abc)+`此时加号修饰的是abc整体,对于字符串`abcabc abcc abccc`可以获取到三个字符串`abcabc` `abc` `abc`
+ 【不理解】取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
+ 每一对括号都会分配一个编号。从左往右数,第一个左括号就是编号1,第二个就是2,以此类推。
+ 注意:捕获组0表示整个正则表达式
`(?:Expression)`非捕获组
+ 【不理解】一些表达式中,不得不使用`()`,但又不需要保存`()`中子表达式匹配的内容,这时可以用非捕获组来抵消使用`()`带来的副作用。

引用捕获组

反向引用
\n这里的n表示数字。
上面说了,每一对小括号都会分配一个编号,从左往右数左括号,依次编号是1,2,3 …
通过反向引用,可以对括号中的内容进行引用。\1表示第一个左括号的内容。
例如:

  • (abc)\1只有一个左括号,这里的\1就表示第一个左括号的内容(abc),所以它表示(abc)(abc)也就是匹配字符串abcabc
  • (ab(def)c)\1\2从左往右数左括号,一共有两个,这显而易见。第一个左括号的内容是(ab(def)c),所以\1就表示(ab(def)c)。第二个左括号的内容是(def),所以\2表示(def)。所以,这个正则表示(ab(def)c)(ab(def)c)(def),也就是匹配字符串abdefcabdefcdef

前后断言

(?=exp)后面能匹配的表达式。
(?!exp)后面不能匹配的表达式。
(?<=exp)前面能匹配的表达式。
(?<!exp)前面不能匹配的表达式。

例如:[a-z]+(?=\d+)能匹配ab a3b abb6 ab34cae24 898pzaj97,表示匹配字母后面是数字的字符串,匹配结果高亮ab a3b abb6 ab34cae24 898pzaj97

常用正则

在这里插入图片描述

其他使用

在这里插入图片描述

Java正则

匹配

1
2
3
4
5
6
7
8
9
/* 
注意:在java字符串中,反斜杠本身代表转义,要使用\w 要写成 \\w
matches:将整个字符串与正则进行匹配
*/
Pattern p = Pattern.compile("\\w+");
Matcher m = p.matcher("abcd123");
boolean bool = m.matches();
System.out.println(bool);// true
System.out.println(p.matcher("abcd 123").matches());// false

查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        /*
find:是否能匹配到下一个符合正则的字符串
group:配合find使用,写的find后面,输出匹配到find匹配到的字符串。
直接用报异常:java.lang.IllegalStateException: No match found
*/
* 单个查找匹配
Matcher m1 = Pattern.compile("\\w+").matcher("abcd 123");
System.out.println(m1.find());// true 匹配下一次,也就是匹配到abcd
System.out.println(m1.group());// abcd
System.out.println(m1.find());// true 匹配下一次,匹配到123
System.out.println(m1.group());// 123
System.out.println(m1.find());// false 匹配下一次,匹配不到符合的字符串了。
//System.out.println(m1.group());// 异常 java.lang.IllegalStateException: No match found
* 循环查找匹配
Matcher m2=Pattern.compile("([a-z]+)([0-9]+)").matcher("abcd123**ss45df");
while (m2.find())
{
System.out.println(m2.group());// 与group(0)作用相同
System.out.println(m2.group(1));// 第一个捕获组的内容
System.out.println(m2.group(2));// 第二个捕获组的内容
//System.out.println(m2.group(3));// 异常:java.lang.IndexOutOfBoundsException: No group 3
System.out.println();
}
/*
输出结果:
abcd123
abcd
123

ss45
ss
45
*/

替换

1
2
3
4
5
6
7
        Matcher m3=Pattern.compile("[0-9]").matcher("abc123def4g56");
* 替换首个
String replaceFirst = m3.replaceFirst("#");
System.out.println(replaceFirst);// abc#23def4g56
* 替换全部
String replaceAll = m3.replaceAll("#");
System.out.println(replaceAll);// abc###def#g##

String

1
2
3
4
5
6
7
8
9
10
11
12
13
        String str="a123b456c789";
* 分割
String[] split = str.split("\\d+");
System.out.println(Arrays.toString(split));// [a, b, c]
* 是否符合正常
boolean matches1 = str.matches("\\w+");
System.out.println(matches1);// true
* 替换首个
String first = str.replaceFirst("\\d", "#");
System.out.println(first);// a#23b456c789
* 替换全部
String all = str.replaceAll("\\d", "#");
System.out.println(all);// a###b###c###