字符类型和元字符
在本课中,我们将学习构成所有正则表达式基本单元的字符。你还将了解元字符,即具有特殊含义的字符。
字符类型
字符是正则表达式中最基本的构建单元。

以下是常见的字符类型:
- 字母或字母表字符 -
A,B,C, ... - 数字 -
0,1,2,3, ... - 标点符号 -
!,.,?,,,;, ... - 其他符号 -
#,$,@, ... - 表示国际文本的 Unicode 字符
在 Java 中,字符使用 Unicode 标准进行编码,该标准的设计使得前八位与 ASCII 编码一致。
运行以下 Java 程序以打印所有 ASCII 字符(扩展集共 256 个字符):
1public class Main 2{ 3 public static void main(String[] args) 4 { 5 System.out.println("<h3>ASCII 字符</h3>"); 6 for(int i = 0; i <= 255; i++) 7 { 8 System.out.print("\t&#" + i + ";"); 9 } 10 } 11}
0 - 31 是 ASCII 控制字符,用于控制硬件设备。
控制字符是非打印字符,除了水平制表符 (\t)、换行符和回车符 (\r) 之外。
空白字符
空白字符在实际输入中非常常见,例如日志文件或用户输入。
空白字符特殊符号 (\s) 可匹配以下任意一种空白字符:
- 空格(
" ") - 制表符(
\t) - 换行符(
\n) - 回车符(
\r)
元字符

元字符对匹配器具有特殊含义。 例如,点号(`.`)表示任意字符。
以下是 Java 正则表达式 API 支持的完整元字符集合:
< > ( ) { } [ ] \ ^ $ - = ! | ? * + .
通过使用反斜杠(\)转义字符,可以强制让一个元字符被视为普通字符。
预定义字符类
以下是 Java 正则表达式 API 中 Pattern 类提供的预定义字符类。它们为最常用的正则表达式提供了简写形式。
| 字符类 | 描述 |
|---|---|
. | 任意单个字符 |
\d | 一个数字 [0-9] |
\D | 非数字 [^0-9] |
\s | 空白字符 [\t\n\x0B\f\r] |
\S | 非空白字符 |
\w | 单词字符 [a-zA-Z_0-9] |
\W | 非单词字符 |
\b | 单词与非单词字符之间的边界 |
例如,正则表达式 \dx\d 可以匹配字符串 1x1、3x5 或 7x4。
下面的代码演示了各种预定义字符类的用法。应尽可能频繁地使用它们,这能让你的正则表达式更易读,并减少出错的可能性。
1import java.util.regex.*; 2 3class Main { 4 public static void main( String args[] ) { 5 6 System.out.println(); 7 System.out.println("数字"); 8 System.out.println("---------------"); 9 System.out.println( Pattern.matches("\\d", "1")); // true 10 System.out.println( Pattern.matches("\\d", "A")); // false 11 12 System.out.println(); 13 System.out.println("非数字"); 14 System.out.println("---------------"); 15 System.out.println( Pattern.matches("\\D", "1")); // false 16 System.out.println( Pattern.matches("\\D", "A")); // true 17 18 System.out.println(); 19 System.out.println("空白字符"); 20 System.out.println("---------------"); 21 System.out.println( Pattern.matches("\\s", " ")); 22 System.out.println( Pattern.matches("\\s", "\n")); 23 System.out.println( Pattern.matches("\\s", "\t")); 24 System.out.println( Pattern.matches("\\s", "A")); 25 26 System.out.println(); 27 System.out.println("非空白字符"); 28 System.out.println("---------------"); 29 System.out.println( Pattern.matches("\\S", " ")); 30 System.out.println( Pattern.matches("\\S", "\n")); 31 System.out.println( Pattern.matches("\\S", "\t")); 32 System.out.println( Pattern.matches("\\S", "A")); 33 34 System.out.println(); 35 System.out.println("单词字符"); 36 System.out.println("---------------"); 37 System.out.println( Pattern.matches("\\w", " ")); 38 System.out.println( Pattern.matches("\\w", "\n")); 39 System.out.println( Pattern.matches("\\w", "1")); 40 System.out.println( Pattern.matches("\\w", "A")); 41 42 System.out.println(); 43 System.out.println("非单词字符"); 44 System.out.println("---------------"); 45 System.out.println( Pattern.matches("\\W", " ")); 46 System.out.println( Pattern.matches("\\W", "\n")); 47 System.out.println( Pattern.matches("\\W", "1")); 48 System.out.println( Pattern.matches("\\W", "#")); 49 50 } 51}
注意: 注意代码中的额外反斜杠(
\)。我们在字符串字面量中使用它作为转义序列,以表示包含预定义元字符的正则表达式。
条件选择
竖线符号(|)表示逻辑“或”,用于指定多个可能的字符组合。
示例:
(I love )(cats|dogs) 匹配 "I love cats" 或 "I love dogs"。
通配符

通配符由点号(`.`)元字符表示。它可以匹配任意单个字符(字母、数字、空白符等)。
若要匹配实际的句点,需使用反斜杠转义,写作 \.。
模式是一组特定的字符序列,我们在此字符串或多个字符串中进行搜索。
开始与结束字符
插入符(^)和美元符号($)是元字符。
^success:匹配以success开头的字符串。success$:匹配以success结尾的字符串。^Mission: successful$:匹配字符串Mission: successful。
分组

**分组**(也称为捕获组)提供了一种将多个字符视为单一单元的方法。我们通过将多个字符放在括号 `( )` 中来表示。
如你所知,( ) 被视为一组字符。
同时,( 和 ) 本身也是元字符。
分组编号
分组从左到右依次编号为 1、2、3……。
引用分组
在输入字符串中,与捕获组匹配的子串会被保存在内存中,以便后续调用,这种引用称为 反向引用。
在正则表达式中指定反向引用时,使用反斜杠(\)后跟一个表示要召回的组的索引号。
1import java.util.regex.Pattern; 2import java.util.regex.Matcher; 3 4class Main { 5 public static void main(String[] args) { 6 String text = "The quick brown fox fox jumped over the lazy dog."; 7 8 // 简单的字符类 9 String searchText = "(fox)\\s\\1"; 10 11 // 创建模式对象 12 Pattern pattern = Pattern.compile(searchText); 13 14 // 创建匹配器,在文本中查找模式 15 Matcher matcher = pattern.matcher(text); 16 17 if (matcher.find()){ 18 System.out.format("找到 \"%s\",位置 [%d-%d]\n", 19 matcher.group(), matcher.start(), matcher.end()); 20 } else { 21 System.out.println("未找到匹配项"); 22 } 23 24 } 25}
在上述示例中,我们正在搜索字符串 "fox fox",其正则表达式表示为 (fox)\\s(fox)。
通过反向引用分组,我们可以将其简洁地表示为 (fox)\\s\\1,其中 \\1 代表正则表达式中从左数第一个分组 (fox)。