Logo
Section 1 / 4

字符类型和元字符

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

导入

字符类型和元字符

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

字符类型

字符是正则表达式中最基本的构建单元。

![](http://network.jancsitech.net:9000/pageflex-ai/images/general/202509/1758266274443925055.png)

以下是常见的字符类型:

  • 字母或字母表字符 - 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)

元字符

![](http://network.jancsitech.net:9000/pageflex-ai/images/general/202509/1758266275919922528.png)

元字符对匹配器具有特殊含义。 例如,点号(`.`)表示任意字符。

以下是 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"。

通配符

![](http://network.jancsitech.net:9000/pageflex-ai/images/general/202509/1758266277690990997.png)

通配符由点号(`.`)元字符表示。它可以匹配任意单个字符(字母、数字、空白符等)。

若要匹配实际的句点,需使用反斜杠转义,写作 \.。

模式是一组特定的字符序列,我们在此字符串或多个字符串中进行搜索。

开始与结束字符

插入符(^)和美元符号($)是元字符。

  • ^success:匹配以 success 开头的字符串。
  • success$:匹配以 success 结尾的字符串。
  • ^Mission: successful$:匹配字符串 Mission: successful。

分组

![](http://network.jancsitech.net:9000/pageflex-ai/images/general/202509/1758266280286052467.png)

**分组**(也称为捕获组)提供了一种将多个字符视为单一单元的方法。我们通过将多个字符放在括号 `( )` 中来表示。

如你所知,( ) 被视为一组字符。
同时,( 和 ) 本身也是元字符。

分组编号

分组从左到右依次编号为 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)。

Java 正则表达式 API

使用字符类进行模式匹配