notepad++正则替换yyyy-mm-dd需用[0-9]{4}-[0-9]{2}-[0-9]{2}(因boost.regex不支持\d{n}),捕获组用$1/$2/$3重排,务必勾选“正则表达式”模式。

Notepad++ 正则替换识别 YYYY-MM-DD 格式
Notepad++ 默认使用 PCRE(Perl 兼容正则),但实际启用的是 Boost.Regex 引擎,不支持 \d{4}-\d{2}-\d{2} 这类简写中的 {n} 量词——它只认 \d\d\d\d-\d\d-\d\d 或 [0-9]{4}-[0-9]{2}-[0-9]{2}(注意:[0-9] 可用,\d 在部分版本中行为不稳定)。
常见错误现象:\d{4}-\d{2}-\d{2} 看似匹配成功,实则替换后漏掉部分日期,或根本没命中——本质是量词未生效。
- 务必用
[0-9]{4}-[0-9]{2}-[0-9]{2}作为查找模式(更稳妥) - 勾选
匹配大小写和匹配整个单词通常不需要,除非你明确想排除2023-12-25T10:30:00这类带时间的字符串 - 如果文本混有中文括号、全角短横(如“2023-12-25”),正则完全不匹配——需先统一为半角字符
把 2023-12-25 替换成 25/12/2023
核心是捕获三组数字并重排。Boost.Regex 支持 、、 引用捕获组,但不支持 或 (后者在某些旧版可能误触发)。
查找目标:([0-9]{4})-([0-9]{2})-([0-9]{2})
替换为:$3/$2/$1
- 括号必须是英文半角,且不能嵌套(Boost 不支持嵌套捕获)
- 若想补零对齐(如
2023-1-5 → 05/01/2023),正则本身做不到;需确保原始数据已是YYYY-MM-DD格式(即月/日两位) - 测试时先用
查找全部确认命中数,再点全部替换——避免误伤注释里的类似数字串(如版本号v2023-01-01)
处理带前缀或后缀的日期(如 date:2023-12-25)
直接套用上一节的正则会把 date: 也替换掉。得用「非捕获前置」或「单词边界」来锚定,但 Boost.Regex 对 \b 支持较弱,推荐显式匹配上下文。
例如只改冒号后的日期:
查找:date:([0-9]{4})-([0-9]{2})-([0-9]{2})
替换:date:$3/$2/$1
- 如果前缀不固定(可能是
start:、end:、created:),用(start|end|created):([0-9]{4})-([0-9]{2})-([0-9]{2}),替换为$1:$4/$3/$2 - 别用
.*?(\d{4})-(\d{2})-(\d{2})——.*?会跨行贪婪匹配,极易误吞其他内容 - 若需保留原前缀但去掉冒号,可捕获前缀和日期两部分,替换时丢弃冒号(如
(start|end):([0-9]{4})-([0-9]{2})-([0-9]{2})→$1 $4/$3/$2)
为什么替换后出现 $1 $2 而不是真实数字
这是 Notepad++ 最常被卡住的地方:没勾选 正则表达式 模式,却写了 $1。此时 $1 被当作文本字面量输出。
- 确认底部状态栏显示
Regular expression(而不是Normal或Extended) -
Extended模式下$1无效,\n表示换行,\t表示 Tab——跟正则无关 - 若用了
\1却没效果,换$1;反之亦然(不同 Notepad++ 版本略有差异,$n更通用) - 替换框里输入
$0会还原整段匹配内容,可用于调试是否捕获正确
真正麻烦的不是写正则,而是原始数据里藏着各种变体:空格、全角符号、多余斜杠、年份缺位(23-12-25)、甚至 Excel 导出的序列号(45282)。批量处理前,先人工抽样检查 5–10 处,比写十遍正则更省时间。











