正则表达式简介
正则表达式(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)**测试不同表达式,以加深理解。