正则表达式简介
正则表达式(Regular Expression, 简称 Regex)全面详解
正则表达式(Regex)是一种强大的文本匹配工具,广泛应用于字符串搜索、文本处理和数据验证等场景。它通过特定的模式(pattern)匹配字符串,并支持复杂的搜索、替换和解析操作。
1. 正则表达式的基本概念
1.1 正则表达式的作用
• 字符串匹配:检查字符串是否符合某种规则(如邮箱、手机号等)。
• 搜索与提取:从文本中提取特定内容(如网页爬取、日志分析)。
• 替换与格式化:使用模式匹配替换字符串中的内容(如去除多余空格)。
1.2 常见的正则表达式语法
正则表达式由普通字符和**元字符(Metacharacters)**组成。
普通字符会被直接匹配,而元字符用于定义匹配规则。
2. 正则表达式的基础语法
2.1 普通字符匹配
普通字符(如 a, b, c)在正则表达式中匹配自身。例如:
hello
匹配字符串 “hello”。
2.2 特殊字符(元字符)
正则表达式包含多个元字符,它们有特殊的意义:
| 元字符 | 说明 | 示例 |
|---|---|---|
| . | 任意单个字符(不包括换行) | a.b 可匹配 “a1b”, “a_b”,但不能匹配 “ab” |
| \d | 任意数字(等价于 [0-9]) | \d{3} 可匹配 “123” |
| \D | 任意非数字字符(等价于 [^0-9]) | \D 可匹配 “a”,但不能匹配 “1” |
| \w | 任意字母、数字或下划线(等价于 [a-zA-Z0-9_]) | \w+ 可匹配 “hello_123” |
| \W | 非字母、数字、下划线(等价于 [^a-zA-Z0-9_]) | \W 可匹配 “@” |
| \s | 任何空白字符(空格、制表符、换行符) | \s+ 可匹配 ” “ |
| \S | 任何非空白字符 | \S+ 可匹配 “hello” |
2.3 重复匹配(量词)
量词用于指定某个模式出现的次数:
| 量词 | 说明 | 示例 |
|---|---|---|
| * | 0 次或多次 | a* 可匹配 “a”, “aa”, “” |
| + | 1 次或多次 | a+ 可匹配 “a”, “aa”,但不能匹配 “” |
| ? | 0 次或 1 次 | a? 可匹配 “a” 或 “” |
| {n} | 正好 n 次 | \d{3} 只能匹配 “123”,不能匹配 “12” |
| {n,} | 至少 n 次 | \d{2,} 可匹配 “12”, “1234” |
| {n,m} | n 到 m 次 | \d{2,4} 可匹配 “12”, “123”, “1234” |
2.4 边界匹配
边界匹配用于确定匹配的位置:
| 边界符 | 说明 | 示例 |
|---|---|---|
| ^ | 匹配字符串开头 | ^abc 只能匹配 “abc”,不能匹配 “xyzabc” |
| $ | 匹配字符串结尾 | xyz$ 只能匹配 “abcxyz”,不能匹配 “xyzabc” |
| \b | 单词边界 | \bcat\b 只匹配 ” cat “,但不匹配 “cater” |
| \B | 非单词边界 | \Bcat\B 可匹配 “scattering” |
2.5 分组与引用
分组用于提取子模式,反向引用用于匹配前面捕获的内容。
| 语法 | 说明 | 示例 |
|---|---|---|
| ( ) | 捕获组 | (ab)+ 可匹配 “abab” |
| (?: ) | 非捕获组 | (?:ab)+ 也匹配 “abab”,但不会存储匹配内容 |
| \1, \2… | 反向引用 | (\w)\1 可匹配 “aa”, “bb” |
2.6 字符集(字符类)
字符集用于匹配某一类字符。
| 语法 | 说明 | 示例 |
|---|---|---|
| [abc] | 匹配 a, b, c 之一 | [aeiou] 匹配任何元音 |
| [^abc] | 匹配非 a, b, c 之一 | [^0-9] 匹配非数字 |
| [a-z] | 匹配小写字母 | [A-Z] 匹配大写字母 |
| [0-9] | 匹配数字 | [0-9A-F] 匹配十六进制字符 |
3. 进阶用法
3.1 断言(零宽度匹配)
断言用于匹配前后环境,而不消耗字符。
| 语法 | 说明 | 示例 |
|---|---|---|
| (?=exp) | 正向先行断言 | \d(?=px) 匹配 “3px” 中的 “3” |
| (?!exp) | 负向先行断言 | \d(?!px) 匹配 “3cm” 中的 “3” |
| (?<=exp) | 正向后行断言 | (?<=\$)\d+ 匹配 “$100” 中的 “100” |
| (?<!exp) | 负向后行断言 | (?<!\$)\d+ 匹配 “100”,但不匹配 “$100” |
3.2 贪婪与懒惰匹配
默认情况下,量词是贪婪的(尽可能多匹配)。
| 语法 | 说明 | 示例 |
|---|---|---|
| .* | 贪婪匹配 | “<b>text</b>” 匹配 “<b>text</b>” |
| .*? | 懒惰匹配 | “<b>text</b>” 只匹配 “<b>” |
4. 常见正则表达式示例
| 任务 | 正则表达式 |
|---|---|
| 匹配邮箱 | ^\w+([.-]?\w+)*@\w+([.-]?\w+)*\.\w+$ |
| 匹配手机号(中国) | ^1[3-9]\d{9}$ |
| 匹配 IPv4 地址 | \b(?:\d{1,3}\.){3}\d{1,3}\b |
| 匹配日期(YYYY-MM-DD) | ^\d{4}-\d{2}-\d{2}$ |
总结
正则表达式是一种强大但复杂的工具,掌握它可以极大提高文本处理效率。建议通过**在线工具(如 regex101)**测试不同表达式,以加深理解。