正则表达式描述文本模式,适合查找、提取、替换和格式校验。不同工具使用的引擎并不完全相同:JavaScript、Python、PCRE2、RE2、POSIX ERE 和 findstr 的语法与能力都有差异。复杂模式必须在目标工具中测试。
核心语法
跳转到“核心语法”| 模式 | 含义 | 示例 | ||
|---|---|---|---|---|
. | 除换行外的任意字符,具体行为受模式选项影响 | a.c | ||
^ / $ | 输入或行的开始 / 结束 | ^ERROR: | ||
[abc] | 字符集合中的一个字符 | [0-9] | ||
[^abc] | 不在集合中的一个字符 | [^,]+ | ||
\d / \s / \w | 数字、空白、单词字符;Unicode 范围依引擎和选项而定 | \d{4} | ||
* / + / ? | 前一单元重复 0 次以上、1 次以上、0 或 1 次 | ab+c | ||
{m,n} | 前一单元重复 m 到 n 次 | \d{2,4} | ||
(...) | 捕获组 | `(cat | dog)` | |
(?:...) | 非捕获组,部分引擎不支持 | (?:https?):// | ||
| `A | B` | 匹配 A 或 B | `yes | no` |
\b | 单词边界,不消耗字符 | \bcat\b | ||
\. | 匹配字面量点号 | example\.com |
字符类、反向引用、环视和 Unicode 属性是最容易出现引擎差异的区域。跨平台脚本优先使用简单模式,并在文档中说明目标引擎。
贪婪与惰性
跳转到“贪婪与惰性”量词默认尽可能多地匹配。追加 ? 通常变为惰性量词,在满足后续模式的前提下尽可能少匹配。
输入:<b>one</b><b>two</b><b>.*</b> -> 整段<b>.*?</b> -> 第一个标签块惰性量词不是“更安全”的通用替代。结构明确时,排除结束符通常更清楚,例如 <b>[^<]*</b>。
查找、提取与替换
跳转到“查找、提取与替换”^(?<level>INFO|WARN|ERROR)\s+(?<message>.+)$该模式把日志级别和消息分组提取。命名组语法依引擎而异;JavaScript 和部分 PCRE 风格引擎支持 (?<name>...),Python 常用 (?P<name>...)。
替换语法也由工具决定。VS Code 和 JavaScript 常用 $1 引用第一个捕获组,部分命令行工具使用 \1。先查看目标工具文档,不要只验证查找模式。
常见陷阱
跳转到“常见陷阱”- 只验证局部:校验完整输入时通常需要
^...$,某些引擎可使用更严格的输入边界。 - 转义两次:正则写在编程语言字符串中时,反斜杠还要经过字符串解析,例如 JavaScript 字符串中的
"\\d+"。 - 回溯失控:嵌套、含糊量词可能导致极慢匹配。对外部输入限制长度,并避免
(.*)+一类结构。 - 把解析器问题交给正则:嵌套 JSON、XML 和编程语言语法应使用对应解析器。
- 忽略换行和 Unicode:点号、边界、大小写和字符类行为受引擎选项影响。
测试方法
跳转到“测试方法”至少覆盖:正常输入、空输入、边界长度、相似但不应匹配的输入、换行、非 ASCII 文本和超长恶意输入。先写出输入与期望结果,再优化模式;可读性比少几个字符更重要。
来源:CSDN 原文,首次发布于 2025-04-27。