
用 Notepad 做正则表达式替换这件事很多人以为只是“查找替换的高级版”其实把它用好了能直接把几小时的重复劳动压缩成一次 CtrlH。这些年我处理过几百万行的日志、批量清洗过 CSV 表格、重构过老代码里的命名混乱凡是涉及文本格式统一和内容提取的活儿第一个打开的工具基本就是它。Notepad 的正则替换不像某些现代编辑器那样需要装扩展、配环境打开就能用应对大文件也够稳这也是它至今没被我丢进“淘汰清单”的原因。这篇文章就围绕“Notepad 正则表达式替换”来写把查找框、替换框里的语法细节、实操案例和坑一次性讲清楚。适合每天跟日志、数据文件、代码打交道的开发者也适合刚接触正则的运维和测试同学。读完你至少能省下一批手动整理文本的时间还能绕开很多我当年反复踩过才明白的坑。1. 为什么我坚持用 Notepad 做正则替换很多新人会问VS Code、Sublime Text 也有正则替换而且界面更现代为什么还抱着 Notepad 不放我的回答很直接因为它轻、快、不挑机器而且在“纯文本处理”这个场景里它做的比大多数现代编辑器更纯粹。1.1 轻量级与大文件处理能力Notepad 是个绿色级的小工具安装包体积很小启动速度几乎感觉不到延迟。相比之下VS Code 启动以后光是插件和进程就要占用不少内存遇到几百 MB 甚至 1GB 以上的日志文件时光是打开就要等半天滚动起来还会掉帧。正则替换最常面对的恰恰就是大文件——线上服务日志、数据库导出文件、爬虫抓下来的数据包动辄几十万行起步。我在某次处理线上日志时文件有 800MBNotepad 打开并执行正则替换操作仍然顺畅搜一下也就一两秒。换 VS Code 的话大概率会直接卡死或弹出“文件过大是否继续打开”的提示。这个场景下Notepad 的优势可以说是降维打击。1.2 跨文件替换和多目录搜索能力Notepad 有一个容易忽略但极其好用的功能“在文件中查找”和“在文件中替换”。它可以在指定目录下对多个文件统一执行正则匹配和替换不用一个个文件打开再操作。举个例子有次我需要把某个目录下 200 多个配置文件的缩进从“空格”统一改为“Tab”或者把旧接口域名换成新域名利用“在文件中替换”功能一次正则替换就全部处理完。这种“项目级批量操作”的能力是很多轻量编辑器不具备的。1.3 不用插件开箱即用VS Code 里你要用更高级的正则特性可能得装插件或调整配置Sublime Text 的高级功能有些是付费的。Notepad 的查找替换对话框里直接集成了三种模式普通模式、扩展模式、正则表达式模式。其中正则表达式模式基于 C 的 Boost.Regex 库实现常用的正则语法全都支持不需要额外安装任何包。这一点在办公电脑权限受限的环境里尤其重要——不需要管理员权限不需要配置环境变量解压即用跑起来就能干活。1.4 正则引擎的“出身”要先搞清楚Notepad 的正则引擎是 Boost.Regex遵循 ECMAScript 语法这一点和其他工具常用的 PCREPerl Compatible Regular Expressions存在微妙差异。很多人在网上复制了一段别人写的正则粘贴到 Notepad 里发现不生效往往就是吃了引擎差异的亏。关键差异包括特性NotepadBoost.RegexPCRE替换引用$1或\1都可$1懒惰匹配*????支持支持行模式标记默认按行匹配PCRE 可设置(?s)内联修饰符部分版本不识别标准支持字符串开始/结束^$按行生效按行需要(?m)实操中的结论是如果你写的正则没有特殊的内联修饰符基本都能用但遇到(?s)、(?i)这种写法时建议先改用其他等效写法我后面会专门说替换方案。2. 正则替换的语法基础与 Notepad 引擎差异想用好正则替换不能光靠临时搜表达式得先理解几个最核心的语法点然后结合 Notepad 的引擎特性来写。2.1 必备的元字符和量词先过一遍最常用的一组.匹配除换行符外的任意单个字符。*前面的字符出现 0 次或多次。前面的字符出现 1 次或多次。?前面的字符出现 0 次或 1 次。[]字符集比如[0-9]匹配数字。()捕获组用于把匹配内容存起来后面替换时引用。^$匹配行首和行尾。\d\w\s数字、单词字符、空白符的简写。\b单词边界。举例匹配 2024-01-01 这种日期可以写成\d{4}-\d{2}-\d{2}。\d{4}表示四个数字-是普通字符不需要转义。这里要强调一个反直觉的点匹配括号时不要直接写(必须转义成\(否则会被当成捕获组的开始。同理.如果想匹配字面意义上的句点也要写成\.。2.2 捕获组与反向引用替换的灵魂正则替换区别于普通替换的核心就是捕获组。看个最简单的例子想把2024-01-01改成2024/01/01。查找框写(\d{4})-(\d{2})-(\d{2})替换框写$1/$2/$3这里第一对括号捕获了2024第二对捕获了01月第三对捕获了01日。替换时用$1、$2、$3按原顺序引用回去把中间的横杠换成斜杠。如果不需要分组只想引用整段匹配可以用$0或$。需要特别说明的是替换框中的写法Notepad 支持$1和\1两种形式。但从我个人的实践来看在替换框中优先用$1因为\1在有些场景下会被解释成转义字符或者跟后面的数字混淆。你可以在替换框里直接写$1这个在 Notepad 中是最稳的。2.3 贪婪与懒惰匹配正则默认是贪婪的.*会尽可能匹配更多内容。例如文本start first start second end用start.*end匹配时会匹配整行start first start second end而不是第一个start到第一个end。如果我只想匹配最短内容就要用懒惰量词start.*?end这样会匹配start first和start second end分别两次。这个差异在拆分 HTML 标签、提取引号内容时极其关键。2.4 “点号不匹配换行”和跨行问题的替代方案Notepad 正则模式下.默认不匹配换行符。这意味着(.*)永远只能匹配单行内容跨行匹配时会失败。网上很多写(?s)启用“点号匹配换行”的教程在 Notepad 里不一定生效。我给的建议是两种替代方案方案一使用[\s\S]替代.。\s匹配空白符\S匹配非空白符二者组合覆盖了所有字符包括换行。方案二使用 Notepad 查找对话框右下角的“正则表达式”复选框旁边的**“.”匹配换行**选项。勾选以后.也会匹配换行符。新版 Notepad 的查找对话框支持这个选项。举个例子跨行匹配一段开头为 BEGIN、结尾为 END 的内容BEGIN[\s\S]*?END这样能把跨行的整段内容都匹配出来比费劲调试(?s)靠谱得多。2.5 转义字符与扩展模式的区别Notepad 的查找模式里“扩展模式”和“正则表达式模式”是两个独立选项。新手常常会把它们搞混。扩展模式只支持\n、\t、\r等固定转义序列不支持任意正则语法。正则表达式模式支持完整正则但如果你想在正则里匹配字面意义上的\n换行就不能只写\n而要使用\r\n或\n的组合其实正则模式下\n是支持的它是合法转义。我给你的实操建议是假如你要做的只是“把换行符替换成逗号”用扩展模式最快查找框写\r\n替换框写,。但如果要做更复杂的匹配一定要切到“正则表达式”模式。3. 可以直接抄作业的正则替换实操案例这一节整理的是我这些年经常用的几个场景每一个都经过实测。你可以直接把表达式复制进 Notepad 用但建议先点击“查找下一个”验证效果再决定是否“全部替换”。3.1 日志时间戳格式统一很多系统导出的日志日期格式不统一比如有的是2024-01-01 10:00:00有的是2024/01/01 10:00:00。想统一成一种格式用捕获组很快。把/格式改成-格式查找框(\d{4})\/(\d{2})\/(\d{2})替换框$1-$2-$3注意/在正则里不是需要转义的特殊字符通常可以直接写但有些版本中写成\/更保险。日期分离后用$1-$2-$3重组成新格式同时不影响后面跟着的时间部分。我遇到过的情况是日期后紧跟时间和日志内容比如2024/01/01 10:00:00 [INFO] 请求完成替换后变成2024-01-01 10:00:00 [INFO] 请求完成只动了日期分隔符其余原样保留。3.2 批量提取日志中的 URL有时你不需要替换只是想把日志文本中的所有 URL 提取出来。Notepad 的“标记”功能配合正则很好用。查找框https?:\/\/[\w\-.\/?%]然后点击“标记全部”所有匹配的 URL 会高亮显示。如果想把它们单独复制出来可以使用“查找全部”并切换到“消息”列表或者直接复用查找结果。这个方法比手动一条条找 URL 高效得多。如果日志里既有http://又有https://用https?就同时覆盖两种情况。[\w\-.\/?%]则是把 URL 当中可能出现的合法字符都算进去防止截断。3.3 清理行首的行号和多余空白从某些测试平台复制日志时行首常会带上序号和多余空格比如1 2024-01-01 10:00:00 [INFO] start 2 2024-01-01 10:01:00 [INFO] end想去掉行首的数字空格查找框^\s*\d\s替换框留空全部替换即可。这里的^锚定行首\s*吃掉可能存在的空格\d吃掉序号最后的\s吃掉序号后面的空白。因为 Notepad 默认按行匹配^能正确识别每一行的开头。我提醒一下替换前建议先“查找下一个”看看是否误伤了正常文本中行首的数字。如果文本中有以数字开头的普通行需要再加上更严格的限定比如行号后必须跟\d{2,}或者带时间格式等视情况调整。3.4 去掉重复行数据文件里经常出现连续重复行如果不先排序正则很难同时处理不相邻的重复项。正确流程是先对文本排序再用正则压缩相邻重复行。排序以后用查找框^(.*)(\r?\n\1)$替换框$1这段表达式依赖反向引用(.*)捕获当前行内容\1引用之前捕获的内容(\r?\n\1)表示后面跟着一行完全相同的内容。替换后只会保留第一行。需要注意该操作只对“连续重复”有效。如果重复行不连续必须先排序再处理。排序可以用 Notepad 的“编辑”-“行操作”-“升序排列”或使用 TextFX 插件。处理 Windows 换行时\r?\n已经兼顾了\r\n和\n两种换行格式。3.5 手机号或身份证号打码做数据脱敏时正则替换是最顺手的方式。把手机号中间四位打码查找框(\d{3})\d{4}(\d{4})替换框$1****$2比如13812345678替换后变成138****5678。这个表达式利用分组把前 3 位和后 4 位保留中间用星号覆盖。身份证号打码同理只是位数不同查找框(\d{6})\d{8}(\d{3}[\dXx])替换框$1********$2它把前 6 位和末 4 位保住中间 8 位变成星号。脱敏这种操作对安全要求高用正则处理完以后建议再抽查几行确认没有遗漏或误替换。3.6 代码中批量修改变量名或函数名老项目重构时经常要把某个命名风格统一比如把下划线命名的变量old_name改成驼峰oldName。但直接全文替换会把注释、字符串里的同样文本也一起改掉。更稳的方法是使用单词边界\b查找框\bold_name\b替换框oldName\b表示单词边界它能保证只匹配完整的old_name单词不会误伤old_name_extra或my_old_name这里要注意my_old_name本身也会匹配因为old_name前后都是__也是单词字符的一部分实际上\b的判定是“单词字符与非单词字符的边界”_属于单词字符所以my_old_name中old_name左侧是_也是单词字符所以没有边界不会匹配。这正好符合需求。同理可以用在类名、函数名的批量修改上。替换之前强烈建议在“标记”面板先高亮看看匹配范围防止误伤。3.7 多文件批量替换把所有换行统一为 LF跨平台协作时Windows 的\r\n和 Linux 的\n混在一起会引发各种诡异问题。用 Notepad 的“在文件中替换”能一次统一整个目录。操作步骤打开“搜索”-“在文件中替换”或快捷键 CtrlShiftH。“查找内容”填写\r\n但注意这里要选择“扩展模式”因为你要匹配的是换行符本身不是字符串\r和\n。“替换为”填写\n。“目录”选择目标文件夹“过滤器”填写*.txt;*.log;*.csv这类文件后缀。点击“在文件中全部替换”。我这里重点提醒如果目标是统一行尾用“扩展模式”最快如果用正则模式也可以写\r\n它会识别为回车加换行但扩展模式更直观。3.8 日志中提取并拼接 SQL 字段有一次处理数据库导出的文本内容是每行一个字段但目标格式要求用逗号拼接比如把name age email mobile改成name,age,email,mobile最直接的方法是先把换行符替换为逗号。操作上注意要分两步第一步用扩展模式查找\r\n替换为一个空格。第二步再把空出来的位置统一处理这取决于具体需求。如果只是简单合并可以直接把换行替换为逗号但要注意文本末尾也会多一个逗号所以要额外清理一下。更精细的做法是用正则匹配多行内容。可以先开启“.”匹配换行选项用^([a-z])\r?\n配合捕获组把每行末尾的换行替换成逗号然后手动处理最后一行。这个方法虽然多几步但可控性好不会把一个多行文本块里的所有换行都误伤。4. 常见问题与排查技巧实录用了这么多年 Notepad 正则替换踩过的坑不少。我挑了几个最常见的写下来你遇到问题时可以直接对照着查。4.1 替换不生效最容易被忽略的三个开关替换没反应时第一件事不是怀疑表达式而是检查查找对话框下方的搜索模式。搜索模式是否选中了“正则表达式”如果默认是“普通”模式正则符号会被当普通文本处理自然没有效果。是否勾选了“匹配大小写”正则里大写字母[A-Z]不会匹配小写这项其实意义不大但如果你在正则里写了[A-Za-z]就不受影响。是否勾选了“循环查找”如果没勾选替换到文件末尾就不会自动到开头继续查找。还有一点如果你选择了“替换全部”但替换框里留空了正则匹配的内容会被删掉。如果发现内容突然少了一大片检查是否把替换框里的$1写成了\1且后面跟了数字比如\11会被解释成第 11 组而不是第 1 组加一个字符。4.2 点号匹配不到换行跨行替换失败的解法这是被问得最多的问题。比如你想匹配两个标记之间的所有内容标记之间跨越了多行查找框写了BEGIN(.*)END结果只匹配了同一行里的内容跨行的一律失败。原因就是前面说的.默认不匹配\r\n。解决办法有三种勾选 find 对话框中的“.”匹配换行选项适用于版本较新的 Notepad。查找框改用[\s\S]代替.BEGIN([\s\S]*?)END把换行先临时替换成特殊占位符处理完后再换回来。这个方法比较笨但兼容性最好。我实际用的最多的还是[\s\S]因为不依赖版本选项复制到哪台机器都能跑。4.3 大文件正则替换卡死的应对策略大文件虽然 Notepad 能打开但如果正则在超大文件上执行全局贪婪匹配比如^.*$这种即使能完成也可能卡顿几秒甚至更久。我的习惯是替换前先“查找全部”确认匹配数量避免一步到位造成的巨大意外。用更精确的匹配范围替代宽泛的.*。比如能写成[^,]就不要用.*?。处理超大文件前先备份或先用“文件”-“另存为”保存一份副本再在副本上做替换操作。如果文件实在太大考虑先把一个整体操作拆成两步、三步降低单次匹配范围。某次处理 800MB 日志时我就是先把所有时间戳部分替换为占位符再做下一步清洗。虽然多点了两次按钮但每一步都不卡整体时间反而更短。4.4 替换后中文乱码编码问题Notepad 打开某些旧系统导出的文件时如果没有自动识别编码替换完成后中文可能变成乱码。通常是因为文件原本是 GBK/ANSI 编码而操作过程中触发了编码转换。预防措施很简单拿到文件后先看右下角状态栏显示的编码比如 UTF-8、ANSI。如果显示 ANSI建议先执行“编码”-“转为 UTF-8 编码”再做正则替换。转码后再替换基本能避免乱码问题。4.5 正则里的中括号与特殊字符转义匹配方括号、括号、点号这类字符一定要转义。比如匹配配置文件里的[section]查找框直接写[section]是错的因为[和]是字符集符号会被当作“匹配 s、e、c、t、i、o、n 中的任意一个字符”。正确写法\[section\]同理匹配 IP 地址里的点号不能写192.168.1.1那样每个点都会匹配任意字符。要写成192\.168\.1\.14.6 反向引用\1在表达式和替换框里的区别很多人在“查找框”里使用\1表示反向引用这没问题但到了“替换框”里\1有时会产生歧义。比如替换框写\1,在 Boost 引擎下可能没问题但换成\11就会出问题因为引擎可能解读成“第 11 组”或者“第 1 组加字符 1”。我的处理原则是替换框统一使用$1、$2这种写法。查找框继续用\1反向引用。两者分工明确避免踩坑。4.7 “在文件中替换”匹配不到内容的排查用“在文件中替换”批量处理时如果替换后一个文件都没变化检查两点过滤器是否写错了扩展名。比如目录里是.txt过滤器写的*.log自然找不到文件。是否勾选了“查找范围”里的“在所有列出的文件”或“跟随文档”如果没选中它可能只搜索当前打开的文件。另外批量替换前建议先备份整个目录。我突然想起来有一次批量替换把某项目的所有.properties文件都动了一遍当时幸好有 Git 版本控制一条恢复命令就回去了。如果没有备份工具建议先复制一份目录替换前留后路永远是对的。4.8 使用“标记全部”避免误操作正则替换最怕的不是没效果而是效果过头。在完全不确认匹配范围的情况下点“全部替换”可能把整段关键数据删掉。我现在的习惯是任何正则替换第一遍先点“查找下一个”第二遍点“查找全部”看数量和列表确认无误后最后才点“全部替换”。Notepad 的“标记全部”会把匹配内容永久高亮高亮后的内容仍以原色显示在编辑区。这个功能极大程度帮我降低了误操作概率尤其是在处理日志脱敏和代码重构这种场景时。5. 正则替换的一些进阶扩展到这里为止基础操作和常见坑都覆盖了。还想分享几个能进一步提效的扩展思路这些是我在实际工作中逐渐摸索出来的用法。5.1 善用“扩展模式”和“正则模式”的切换Notepad 的不同搜索模式各有长处。扩展模式处理换行符、Tab 符最方便正则模式处理复杂模式提取和替换最在行。两种模式并不是互斥使用而是可以根据任务阶段自由切换。举例先切换到扩展模式把\r\n统一替换成\n再切换到正则模式把^#开头的注释行批量删除。一个清洗任务内多次切换模式反而比硬着头皮用单一模式更快。5.2 正则配合“列编辑”处理复杂文本有些情况下正则虽然能匹配但处理起来不如列编辑直观。比如要把一列相同位置的字符改成别的内容使用 Alt鼠标拖选可进入列编辑模式直接输入替换文本。当数据是规整表格时列编辑和正则替换配合能覆盖绝大多数文本格式化需求。5.3 备份查找替换配置Notepad 会在会话中记住最近几次查找和替换的内容但重启后可能丢失。如果你有一组常用的替换表达式建议专门保存到一处比如新建一个regex_snippets.txt按分类记录。这样无论换电脑还是换版本都能快速找回自己的“正则武器库”。我自己的习惯是每条表达式都配一行说明标注使用了哪个模式适用什么场景。遇到相似的文本处理需求时直接翻出来复制不用重新推导。5.4 正则替换后的一轮数据校验正则替换很容易让人产生“已经把全部内容处理完了”的错觉。实际上替换完以后应当再做一轮校验确认结果符合预期。我会用两种方法一是抽查几处匹配边界确认没有多删、漏删。二是用另一个简单正则再次检查。比如替换手机号后可以再查找\d{11}如果仍然能匹配到说明还有未脱敏的数字串也可以查找\d{3}\*{4}\d{4}确认打码格式正确。这种方法比人眼逐行核对高效得多。在我个人处理文本的实际经验里最有价值的体会是正则替换不是一锤子买卖而是一个“设计-验证-执行-校验”的流程。在 Notepad 里点“全部替换”之前多花一分钟做验证往往能省下后面一小时收拾残局的时间。尤其是跨行匹配、多文件操作、编码切换这些容易埋雷的地方宁可多确认两步也别贪快。平时处理日志或数据文件时我会在项目目录里专门放一个“处理备份”文件夹每次动大批量替换前先复制一份进去。这个习惯后来救过我很多次希望你也能用上。