第 2 章:字符匹配基础
2025/9/1大约 5 分钟
第 2 章:字符匹配基础
学习目标
- 掌握字面字符匹配
- 理解和使用字符类 [abc]
- 学会使用预定义字符类(\d、\w、\s等)
- 掌握字符类的取反操作 [^abc]
- 理解点号(.)的特殊含义
2.1 字面字符匹配
字面字符匹配是正则表达式最基础的功能,直接匹配文本中的字符。
基础示例
hello # 匹配 "hello"
123 # 匹配 "123"
Hello # 匹配 "Hello"(区分大小写)
需要转义的特殊字符
某些字符在正则表达式中有特殊含义,如果要匹配它们的字面意思,需要使用反斜杠转义:
\. # 匹配点号 "."
\* # 匹配星号 "*"
\+ # 匹配加号 "+"
\? # 匹配问号 "?"
\^ # 匹配插入符号 "^"
\$ # 匹配美元符号 "$"
\| # 匹配管道符号 "|"
\\ # 匹配反斜杠 "\"
\( # 匹配左括号 "("
\) # 匹配右括号 ")"
\[ # 匹配左方括号 "["
\] # 匹配右方括号 "]"
\{ # 匹配左花括号 "{"
\} # 匹配右花括号 "}"
2.2 字符类 [abc]
字符类用方括号定义,匹配方括号内的任意一个字符。
基础字符类
[abc] # 匹配 'a', 'b', 或 'c'
[123] # 匹配 '1', '2', 或 '3'
[aeiou] # 匹配任意元音字母
[,.!?] # 匹配逗号、句号、感叹号或问号
字符范围
使用连字符指定字符范围:
[a-z] # 匹配任意小写字母
[A-Z] # 匹配任意大写字母
[0-9] # 匹配任意数字
[a-zA-Z] # 匹配任意字母
[0-9a-f] # 匹配十六进制数字
[a-zA-Z0-9] # 匹配字母或数字
组合使用
[a-z0-9] # 匹配小写字母或数字
[A-Za-z] # 匹配任意字母
[0-9.,] # 匹配数字、逗号或句号
2.3 预定义字符类
为了简化常用的字符类,正则表达式提供了预定义的字符类:
基础预定义字符类
\d # 匹配数字,等价于 [0-9]
\w # 匹配单词字符,等价于 [a-zA-Z0-9_]
\s # 匹配空白字符(空格、制表符、换行符等)
对应的取反字符类
\D # 匹配非数字,等价于 [^0-9]
\W # 匹配非单词字符,等价于 [^a-zA-Z0-9_]
\S # 匹配非空白字符
实际应用示例
// JavaScript 示例
const phonePattern = /\d{3}-\d{3}-\d{4}/; // 匹配 123-456-7890
const wordPattern = /\w+/; // 匹配一个或多个单词字符
const spacePattern = /\s+/; // 匹配一个或多个空白字符
2.4 字符类的取反 [^abc]
在字符类中使用插入符号 ^
作为第一个字符,可以取反整个字符类。
取反示例
[^abc] # 匹配除了 'a', 'b', 'c' 之外的任意字符
[^0-9] # 匹配非数字字符,等价于 \D
[^a-zA-Z] # 匹配非字母字符
[^aeiou] # 匹配非元音字母
[^\s] # 匹配非空白字符,等价于 \S
注意事项
[^] # 错误:空的取反字符类
[^\n] # 匹配除换行符外的任意字符
[^a-z\s] # 匹配非小写字母且非空白字符
2.5 点号(.)的特殊含义
点号是正则表达式中最常用的元字符之一。
基本用法
. # 匹配任意字符(通常不包括换行符)
c.t # 匹配 "cat", "cot", "cut", "c@t" 等
h.llo # 匹配 "hello", "hallo", "h3llo" 等
实际示例
// 匹配文件名和扩展名
const filePattern = /.*\.txt$/; // 匹配 .txt 文件
// 匹配 IP 地址的简化版本(不严格)
const ipPattern = /\d+\.\d+\.\d+\.\d+/; // 如 192.168.1.1
点号的限制
在多数正则表达式引擎中,点号默认不匹配换行符:
. # 不匹配 \n(换行符)
[\s\S] # 匹配任意字符(包括换行符)
[^] # 在某些引擎中匹配任意字符(包括换行符)
2.6 组合应用实例
验证用户名
// 用户名只能包含字母、数字和下划线,长度3-16位
const usernamePattern = /^[a-zA-Z0-9_]{3,16}$/;
console.log(usernamePattern.test("user123")); // true
console.log(usernamePattern.test("user_name")); // true
console.log(usernamePattern.test("user@name")); // false
提取数字
import re
text = "订单号:12345,金额:¥199.99"
numbers = re.findall(r'\d+\.?\d*', text)
print(numbers) # ['12345', '199.99']
清理文本
// 移除多余的空白字符
const text = " hello world ";
const cleaned = text.replace(/\s+/g, ' ').trim();
console.log(cleaned); // "hello world"
2.7 字符类的高级用法
字符类中的转义
在字符类内部,某些字符需要转义:
[.] # 匹配点号(在字符类中点号失去特殊含义)
[\]] # 匹配右方括号
[\\] # 匹配反斜杠
[^-] # 匹配除连字符外的字符
[-] # 匹配连字符(放在开头或结尾)
[abc-] # 匹配 'a', 'b', 'c' 或 '-'
[-abc] # 匹配 '-', 'a', 'b' 或 'c'
POSIX 字符类(部分引擎支持)
[:alnum:] # 字母和数字
[:alpha:] # 字母
[:digit:] # 数字
[:lower:] # 小写字母
[:upper:] # 大写字母
[:space:] # 空白字符
使用方式:
[[:alnum:]] # 匹配字母或数字
[[:alpha:]] # 匹配字母
2.8 实践练习
练习1:基础匹配
编写正则表达式匹配以下内容:
- 匹配任意三位数字
- 匹配以大写字母开头的单词
- 匹配包含 @ 符号的字符串
// 答案示例
const threeDigits = /\d{3}/;
const capitalWord = /[A-Z]\w*/;
const hasAt = /.*@.*/;
练习2:字符类应用
编写正则表达式:
- 匹配十六进制颜色代码(如 #FF0000)
- 匹配不包含数字的单词
- 匹配包含元音字母的单词
// 答案示例
const hexColor = /#[0-9a-fA-F]{6}/;
const noDigitWord = /[^\d\s]+/;
const hasVowel = /.*[aeiouAEIOU].*/;
小结
字符匹配是正则表达式的基础,掌握了字面字符、字符类、预定义字符类和点号的用法,就具备了构建复杂正则表达式的基础。重点要记住:
- 字面字符直接匹配,特殊字符需要转义
- 字符类用
[abc]
匹配其中任意一个字符 - 预定义字符类如
\d
\w
\s
简化了常用匹配 [^abc]
用于取反匹配- 点号
.
匹配任意字符(通常不包括换行符)
这些基础知识将在后续章节中不断使用和扩展。