基本介绍

如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:

  1. 限定符
  2. 选择匹配符
  3. 分组组合和反向引用符
  4. 特殊字符
  5. 字符匹配符
  6. 定位符

元字符(Metacharacter)-转义号 \\

\\符号 说明: 在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。

JAVA语言中,两个\\代表其他语言中的一个\

需要用到转义符号的字符有以下:. * + ( ) $ / \ ? [ ] ^ { }

元字符-字符匹配符

符号 符号 实例 解释 匹配输入
[ ] 可接收的字符列表 [efgh] e f g h中的任意一个字符
[^] 不接收的字符列表 [^abc] 除a b c之外的任意一个字符,包括数字和特殊字符
- 连接符 A-Z 任意单个大写字母
. 匹配除\n以外的任何字符 a..b 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 aaab、aefb、a35b、a#*b
\\d 匹配单个数字字符,相当于[0-9] \\d{3}(\\d)? 包含3个或4个数字的字符串 123、9876
\\D 匹配单个非数字字符,相当于[^0-9] \\D(\\d)* 以单个非数字字符开头,后接任意个字符串 a、A342
\\w 匹配单个数字、大小写字母字符相当于[0-9a-zA-Z_] \\d{3}\\w{4} 以3个数字字符开头的长度为7的数字字母字符串 234abcd、12345pe
\\W 匹配单个非数字、大小写字母字符相当于[^0-9a-zA-Z] \\W+\\d{2} 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 #29、#?@10
\\s 匹配任何空白字符(空格,制表符等)
\\S 匹配任何非空白字符,和\s相反

应用实例

  1. [a-z]说明:[a-z] 表示可以匹配a-z中任意一个字符,比如[a-z] 、 [A-Z] 去匹配 a11c8会得到什么结果?
1
2
3
4
5
6
7
8
9
10
11
String content = "a11c8":
String regStr = "[a-z]";//匹配 a-z之间任意一个字
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 a
找到 c
1
2
3
4
5
6
7
8
9
10
String content = "a11c8":
String regStr = "[A-Z]";//匹配 A-Z之间任意一个字
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出

  1. java正则表达式默认是区分字母大小写的,如何实现不区分大小写

    • (?i)abc 表示abc都不区分大小写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String content = "a11c8abcABC":
    String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]
    Pattern pattern = Pattern.compile(regStr);
    Matcher matcher = pattern.matcher(content):
    while (matcher.find()){
    System.out.println("找到 + matcher.group(0));
    }

    // 输出
    找到 abc
    找到 ABC
    • a(?i)bc 表示bc不区分大小写
    • a((?i)b)c 表示只有b不区分大小写
    • Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
  2. [^a-z]说明:[^a-z] 表示可以匹配不是a-z中的任意一个字符,比如
    我们看看 [^a-z] 去匹配 a11c8 会得到什么结果? 用[^a-z]{2} 又会得到什么结果呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String content = "a11c8abcABC":
String regStr = "[^a-z]";//匹配 不在 a-z之间的任意一个字符
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 1
找到 1
找到 8
找到 A
找到 B
找到 C

元字符-选择匹配符

在匹配某个字符串的时候是选择性的,即: 既可以匹配这个,又可以匹配那个,这时你需要用到 选择匹配符号

符号 符号 示例 解释
| 匹配` `之前或之后的表达式 ab|cd

元字符-限定符

用于指定其前面的字符和组合项连续出现多少次

符号 含义 示例 说明 匹配输入
* 指定字符重复0次或n次 (abc)* 仅包含任意个abc的字符串,等效于\w* abc、abcabcabc
+ 指定字符重复1次或n次(至少一次) m+(abc)* 以至少1个m开头,后接任意个abc的字符串 m、mabc、mabcabc
? 指定字符重复0次或1次(最多一次) m+abc? 以至少1个m开头,后接ab或abc的字符 mab、mabc、mmmab、mmabc
{n} 只能输入n个字符 [abcd]{3} 由abcd中字母组成的任意长度为3的字符串 abc、adc、dbc
{n,} 指定至少n个匹配 [abcd]{3,} 由abcd中字母组成的任意长度不小于3的字符串 aab、dbc、aaabdc
{n,m} 指定至少 n 个但不多于 m 个匹配 [abcd]{3,5} 由abcd中字母组成的任意长度不小于3不大于5的字符串 abc.abcd.、aaaaabcdab

实例

  1. 1{3}去匹配1111111的话,会得到什么结果呢?
1
2
3
4
5
6
7
8
9
10
11
String content = "1111111aaahello":
String regStr = "1{3}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 111
找到 111
  1. 1{3,4}去匹配1111111的话,会得到什么结果呢?
1
2
3
4
5
6
7
8
9
10
11
String content = "1111111aaahello":
String regStr = "1{3,4}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 1111
找到 111

java匹配默认贪婪匹配,尽可能匹配多的

  1. 1+去匹配1111111的话,会得到什么结果呢?
1
2
3
4
5
6
7
8
9
10
String content = "1111111aaahello":
String regStr = "1+";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 1111111

元字符-定位符

定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置

符号 含义 示例 说明 匹配输入
^ 指定起始字符 ^[0-9]+[a-z] 以至少1个数字开头,后接任意个小写字 母的字符串 123、6aa、555edf
$ 指定结束字符 ^[0-9]\\-[a-z]+$ 以1个数字开头后接连字符“-”,并以至少1个小写字母结尾的字符串 1-a
\\b 匹配目标字符串的边界 han\\b 这里说的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置 hanshunpingsphan nnhan
\B 匹配目标字符串的非边界 han\\B 和\b的含义相反 hanshunpingsphan nnhan

实例

  1. ^,$使用
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
String content = "123abc":
String regStr = "^[0-9]+[a-z]*";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 123abc


String content = "a123abc":
String regStr = "^[0-9]+[a-z]*";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出


String content = "123abc12":
String regStr = "^[0-9]+[a-z]*";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 123abc

String content = "123abc":
String regStr = "^[0-9]+[a-z]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出
找到 123abc

String content = "123abc1":
String regStr = "^[0-9]+[a-z]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
}

// 输出

分组

常用分组构造形式 说明
(pattern) 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编
(?pattern) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?’name’)

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String content = "abc1234":
String regStr = "(\\d\\d)(\\d)(\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content):
while (matcher.find()){
System.out.println("找到 + matcher.group(0));
System.out.println("找到第一个分组内容 + matcher.group(1));
System.out.println("找到第二个分组内容 + matcher.group(2));
System.out.println("找到第三个分组内容 + matcher.group(3));
}

// 输出
找到 1234
找到第一个分组内容 12
找到第二个分组内容 3
找到第三个分组内容 4

特别分组

常用分组构造形式 说明
(?pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用”or”字符(组合模式部件的情况很有用。例如,”industr(?:ylies) 是比industrylindustries’更经济的表达式。
(?=pattern) 它是一个非捕获匹配。例如,Vindows(?=95|98|NT|2000)’匹配”Vindows2000”中的”Windows”,但不匹配”Windows3.1”中的’Windows”
(?!pattern) 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如,Vindows(?!9598NT|2000)’匹配”Windows3.1”中的”Windows”,但不匹配”Vindows2000”中的”Windows”。