概述(What)
本文是一份实用性强、具备良好可移植性的正则表达式技术参考,内容涵盖基本语法、多行模式处理、替换技巧、工具兼容性和可维护的模式设计。
目的(Why)
正则表达式是文本验证、解析、转换和数据提取的核心技术。几乎所有编程语言和平台都支持,掌握它能大幅提升自动化、数据清洗与分析的效率。
Part 1:基础语法
模式 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
. |
除换行符外任意单个字符 | a.c |
abc , a-c |
* |
前一字符重复0次或多次 | go*gle |
ggle , google |
+ |
前一字符重复1次或多次 | go+gle |
gogle , google |
? |
前一字符重复0次或1次 | colou?r |
color , colour |
{n} |
前一字符重复n次 | a{3} |
aaa |
{n,m} |
前一字符重复n至m次 | a{2,4} |
aa , aaa , aaaa |
^ |
匹配行首 | ^abc |
以abc 开头的行 |
$ |
匹配行尾 | abc$ |
以abc 结尾的行 |
[] |
匹配中括号内任一字符 | [abc] |
a , b , c |
[^] |
排除中括号内的字符 | [^0-9] |
非数字字符 |
\d |
数字(digit) | \d+ |
123 , 007 |
\D |
非数字字符 | \D+ |
abc , XYZ |
\w |
单词字符(字母、数字、下划线) | \w+ |
abc_123 |
\W |
非单词字符 | \W+ |
#@! , 空格等 |
\s |
空白字符 | \s+ |
空格、换行、制表符 |
\S |
非空白字符 | \S+ |
abc , 123 |
` | ` | 或逻辑 | `foo |
() |
分组 | (abc)+ |
abcabc |
\b |
单词边界 | \bregex\b |
精确匹配单词"regex" |
Part 2:实用模式(多语言适配)
用途 | 模式 | 说明 |
---|---|---|
仅包含数字 | ^\d+$ |
纯数字字符串 |
带小数的数字 | ^\d+\.\d+$ |
允许一个小数点 |
字母和数字 | ^[a-zA-Z0-9]+$ |
常用于ID或用户名 |
简易邮箱验证 | ^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$ |
匹配一般邮箱格式 |
URL(http/https) | https?://[\w.-]+\.[a-zA-Z]{2,}(/[\w./?=&%-]*)? |
支持路径与查询参数 |
ISO日期 | \d{4}-\d{2}-\d{2} |
格式为YYYY-MM-DD |
国际电话 | \+\d{1,3}[\s-]?\d{1,14} |
如:+86 138... |
用户名格式 | ^[a-zA-Z0-9._-]{3,20}$ |
适用于SNS等 |
密码强度 | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ |
至少包含大小写字母与数字 |
Part 3:多行匹配(Multi-Line)
🔹 为什么使用 [\s\S]*?
.
默认不匹配换行,因此匹配多行块时推荐使用:
[\s\S]*?
它以非贪婪方式匹配任意字符(包括换行)。
💡 一些工具如VSCode支持
[\s\S\n]*?
,冗余但可提高兼容性。
🔹 常用示例
用途 | 模式 | 说明 |
---|---|---|
任意文本块 | [\s\S]*? |
安全地跨行匹配 |
HTML div块 | <div[\s\S]*?</div> |
匹配完整div结构 |
HTML注释 | <!--[\s\S]*?--> |
提取注释块 |
Markdown代码块 | "[\s\S]*? " |
匹配三反引号代码段 |
Part 4:替换技巧(Replacement Techniques)
🔹 分组引用语法
${1}
/${2}
(VSCode, Python等)$1
/$2
(JavaScript, sed等)
🔹 实例用法
任务 | 模式 | 替换示例 |
---|---|---|
反转两个单词 | (\w+)\s+(\w+) |
${2} ${1} |
给文本加span标签 | >([^<]+)< |
><span>${1}</span>< |
CSV转JSON格式 | ^([^,]+),([^,]+),([^,]+)$ |
{ "a": "${1}", "b": "${2}", "c": "${3}" } |
日期格式替换 | (\d{4})/(\d{2})/(\d{2}) |
${1}-${2}-${3} |
驼峰转下划线 | ([a-z])([A-Z]) |
${1}_${2} |
Part 5:工具支持与匹配标志
工具 | 多行支持 | 非贪婪匹配 | 替换语法 | 说明 |
---|---|---|---|---|
VSCode | ✅(查找面板) | ✅ | ${1} |
推荐 [\s\S]*? |
JavaScript | ✅(使用/s ) |
✅ | $1 , $<name> |
支持命名分组 |
Python (re ) |
✅(re.DOTALL) | ✅ | \g<1> , \1 |
建议使用原始字符串如 r"" |
sed | ❌(逐行) | ❌ | \1 , \2 |
功能有限,仅适合简单任务 |
grep/egrep | ❌ | ❌ | ❌ | 不支持替换,仅能查找匹配 |
Part 6:设计准则与反面案例(Best Practices)
✅ 推荐做法
- 处理换行使用
[\s\S]*?
(必要时加\n
) - 避免贪婪匹配,优先使用非贪婪
*?
- 不需捕获时使用非捕获分组
(?:...)
- 使用命名分组提升可读性:
(?<year>\d{4})
- 复杂表达式使用注释模式
re.VERBOSE
❌ 反面模式
模式 | 问题描述 |
---|---|
.* |
贪婪匹配过多内容 |
[^a-z] |
不支持带重音字符、非拉丁文字 |
嵌套结构 | HTML/XML等嵌套语法不适合用正则解析 |
.+ |
可能匹配仅含空格的行 |
结语(Conclusion)
本指南旨在帮助你在各种环境下安全、准确地使用正则表达式。
多行处理推荐标准化使用 [\s\S]*?
,并结合各工具特点合理设计模式,使表达式更具可维护性和复用性。
良好的正则表达式不仅能提升效率,更是自动化的利器。