
目录
引言
一、基本概念
1.1 元字符
1.2 预定义字符类
1.3 边界匹配符
1.4 数量标识符
1.5 捕获与非捕获分组
二、Java中的正则表达式支持
三、正则表达式的使用示例
3.1 匹配字符串
3.2 替换字符串
3.3 分割字符串
3.4 使用Pattern和Matcher
3.5 捕获组和后向引用
3.6 贪婪模式和勉强模式的对比
四、正则表达式的进阶使用
结语
引言
正则表达式(Regular Expression)是计算机科学中的一个重要概念,它是一种强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。正则表达式由普通字符(如a~z)和特殊字符(元字符)组成,用于描述在查找文字主体时待匹配的一个或多个字符串。在Java中,正则表达式通过java.util.regex包提供支持,主要包括Pattern和Matcher两个类,以及String类中的几个特殊方法。
一、基本概念
正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
1.1 元字符
| 表达式 | 含义 | 
|---|---|
. | 匹配任意单个字符(换行符除外) | 
| \ | 转义字符,用于匹配特殊字符或表示特殊序列 | 
^ | 匹配输入字符串的开始位置 | 
$ | 匹配输入字符串的结束位置 | 
* | 匹配前面的子表达式零次或多次 | 
+ | 匹配前面的子表达式一次或多次 | 
? | 匹配前面的子表达式零次或一次 | 
{n} | 匹配前面的子表达式恰好n次 | 
{n,} | 匹配前面的子表达式至少n次 | 
{n,m} | 匹配前面的子表达式至少n次,但不超过m次 | 
[] | 字符类,匹配方括号中的任意字符 | 
| | 逻辑“或”操作符,匹配左右两边的表达式之一 | 
| () | 分组,将多个字符或表达式组合成一个子表达式,用于后续引用或操作 | 
| (?i) | 忽略后面字符的大小写 | 
1.2 预定义字符类
| 表达式 | 含义 | 
|---|---|
| \d | 匹配一个数字字符,等价于[0-9] | 
| \D | 匹配一个非数字字符,等价于[^\d] | 
| \s | 匹配任何空白字符,包括空格、制表符、换页符等,等价于[\t\n\r\f\v] | 
| \S | 匹配任何非空白字符,等价于[^\s] | 
| \w | 匹配任何单词字符(包括字母、数字和下划线),等价于[a-zA-Z0-9_] | 
| \W | 匹配任何非单词字符,等价于[^\w] | 
1.3 边界匹配符
| 表达式 | 含义 | 
|---|---|
| ^ | 匹配输入字符串的开始位置 | 
| $ | 匹配输入字符串的结束位置 | 
| \b | 匹配一个单词边界,即单词字符和非单词字符之间的位置 | 
| \B | 匹配非单词边界 | 
1.4 数量标识符
- 贪婪模式(Greedy):数量表示符默认采用贪婪模式,会一直匹配下去,直到无法匹配为止。
 - 勉强模式(Reluctant):用问号后缀?表示,只会匹配最少的字符,也称为最小匹配模式。
 - 占有模式(Possessive):用加号后缀+表示,目前只有Java支持占有模式,通常比较少用。
 
1.5 捕获与非捕获分组
捕获分组:
后续还要使用本组的数据
正则表达式内部使用:\\组号
正则表达式外部使用:$组好
非捕获分组:
| 符号 | 含义 | 
|---|---|
| (? : 正则) | 获取所有 | 
| (? = 正则) | 获取前面部分 | 
| (? ! 正则) | 获取不是指定内容的前面部分 | 
二、Java中的正则表达式支持
Java提供了多种方式来使用正则表达式,包括String类中的方法以及Pattern和Matcher类。
- String类中的方法: 
  
- boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
 - String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
 - String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
 - String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
 
 - Pattern和Matcher类: 
  
- Pattern类:用于表示编译后的正则表达式。通过调用Pattern.compile(String regex)方法,可以将一个字符串形式的正则表达式编译成一个Pattern对象。
 - Matcher类:用于对输入字符串进行匹配操作。通过调用Pattern对象的matcher(CharSequence input)方法,可以创建一个Matcher对象,然后使用该对象进行匹配操作。
 
 
三、正则表达式的使用示例
3.1 匹配字符串
String value = "12345";  
String regex = "\\d{5}";  
boolean matches = Pattern.matches(regex, value);  
System.out.println("The Result is: " + matches); // 输出: The Result is: true 
3.2 替换字符串
String s = "1324.5421";  
String s1 = s.replaceAll("[0-4]{4}\\.\\w{4}", "!");  
System.out.println(s1); // 输出: ! 
3.3 分割字符串
String s = "1324.5421";  
String[] split = s.split("\\."); // 分割后数组为[1324, 5421] 
3.4 使用Pattern和Matcher
String value = "12345";  
String regex = "\\d{5}";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(value);  
System.out.println("The Result is: " + matcher.matches()); // 输出: The Result is: true 
3.5 捕获组和后向引用
String text = "go go";  
String regex = "\\b(\\w+)\\b\\s+\\1\\b";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(text);  
while (matcher.find()) {  
    System.out.println("Found match: " + matcher.group()); // 输出: Found match: go go  
} 
3.6 贪婪模式和勉强模式的对比
String str = "hello,java!";  
// 贪婪模式的正则表达式  
System.out.println(str.replaceFirst("\\w*", "■")); // 输出: ■,java!  
// 勉强模式的正则表达式  
System.out.println(str.replaceFirst("\\w*?", "■")); // 输出: ■hello,java! 
四、正则表达式的进阶使用
- 字符类中的范围和否定: 
  
- [a-z]:匹配任意小写字母。
 - [A-Z]:匹配任意大写字母。
 - [0-9]:匹配任意数字。
 - [^a-z]:匹配任意非小写字母的字符。
 
 - 分组和命名捕获组: 
  
- (expression):将表达式分组,并捕获匹配的文本。
 - (?<name>expression):将表达式分组,并给捕获组命名。
 
 - 零宽度断言: 
  
- (?=exp):零宽度正预测先行断言,断言被匹配的字符串以表达式exp结尾,但不包括exp本身。
 - (?<=exp):零宽度正回顾后发断言,断言自身出现的位置前面能匹配表达式exp,但不包括exp本身。
 
 - 条件表达式: 
  
- (?(condition)yes-pattern|no-pattern):根据条件选择匹配yes-pattern或no-pattern。
 
 - 正则表达式的选项: 
  
- Pattern.CASE_INSENSITIVE:忽略大小写。
 - Pattern.MULTILINE:多行模式,使
^和$能够匹配输入字符串的每一行开头和结尾。 - Pattern.DOTALL:点匹配所有字符,包括换行符。
 
 
结语
正则表达式是一种强大且灵活的字符串处理工具,在Java中得到了广泛的应用。通过掌握正则表达式的基本概念、元字符、预定义字符类、边界匹配符和数量标识符等知识点,以及Java中提供的String类方法和Pattern、Matcher类的使用方式,我们可以高效地处理各种字符串匹配、替换和分割等操作。同时,正则表达式的进阶使用技巧,如字符类中的范围和否定、分组和命名捕获组、零宽度断言和条件表达式等,也为我们提供了更强大的字符串处理能力。
 



















