👨🏻‍💻 编程

正则表达式简介

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

留言

您的邮箱地址不会被公开。 必填项已用 * 标注