正则表达式实务参考完全指南(多语言与多行处理)

概述(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]*?,并结合各工具特点合理设计模式,使表达式更具可维护性和复用性。

良好的正则表达式不仅能提升效率,更是自动化的利器。

标题和URL已复制