跳转到内容
新建笔记

正则表达式

正则表达式描述文本模式,适合查找、提取、替换和格式校验。不同工具使用的引擎并不完全相同: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}
(...)捕获组`(catdog)`
(?:...)非捕获组,部分引擎不支持(?:https?)://
`AB`匹配 A 或 B`yesno`
\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。先查看目标工具文档,不要只验证查找模式。

  1. 只验证局部:校验完整输入时通常需要 ^...$,某些引擎可使用更严格的输入边界。
  2. 转义两次:正则写在编程语言字符串中时,反斜杠还要经过字符串解析,例如 JavaScript 字符串中的 "\\d+"。
  3. 回溯失控:嵌套、含糊量词可能导致极慢匹配。对外部输入限制长度,并避免 (.*)+ 一类结构。
  4. 把解析器问题交给正则:嵌套 JSON、XML 和编程语言语法应使用对应解析器。
  5. 忽略换行和 Unicode:点号、边界、大小写和字符类行为受引擎选项影响。

至少覆盖:正常输入、空输入、边界长度、相似但不应匹配的输入、换行、非 ASCII 文本和超长恶意输入。先写出输入与期望结果,再优化模式;可读性比少几个字符更重要。


来源:CSDN 原文,首次发布于 2025-04-27。