为什么 Notepad++ 用户必须学正则?
如果你还在用"手动删除空行""逐行复制粘贴""一个个改格式"来处理文本,那么正则表达式将彻底改变你的工作方式。
Notepad++ 内置的正则引擎基于 Scintilla,支持 Perl 兼容正则(PCRE)的大部分语法。掌握之后,以下任务都可以在几秒钟内完成:
- 从 10 万行日志中提取所有 IP 地址和错误码
- 将 Excel 导出的混乱数据清洗为标准 CSV
- 批量重命名变量、统一代码风格
- 提取网页源码中的链接、邮箱、手机号
- 将 Markdown 表格转为 HTML 或 JSON
下面从最基础的语法开始,逐步进阶到实战场景。
一、Notepad++ 正则基础语法速查
1. 打开正则模式
在 Notepad++ 中按 Ctrl + H 打开替换窗口,底部**"查找模式"**选择 "正则表达式"。
提示 :勾选 ". 匹配新行" 可以让
.匹配换行符,用于跨行匹配。
2. 常用元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
. |
匹配任意单个字符(除换行符) | a.c 匹配 "abc"、"a1c" |
^ |
匹配行首 | ^Hello 匹配以 Hello 开头的行 |
$ |
匹配行尾 | end$ 匹配以 end 结尾的行 |
* |
前一项出现 0 次或多次 | ab*c 匹配 "ac"、"abc"、"abbc" |
+ |
前一项出现 1 次或多次 | ab+c 匹配 "abc"、"abbc",不匹配 "ac" |
? |
前一项出现 0 次或 1 次 | colou?r 匹配 "color" 和 "colour" |
\d |
匹配数字(0-9) | \d+ 匹配一个或多个数字 |
\w |
匹配单词字符(字母、数字、下划线) | \w+ 匹配一个单词 |
\s |
匹配空白字符(空格、制表符等) | \s+ 匹配一个或多个空白 |
[abc] |
匹配方括号中的任意一个字符 | [aeiou] 匹配任意元音字母 |
[^abc] |
匹配不在方括号中的字符 | [^0-9] 匹配非数字 |
() |
分组 / 捕获 | (ab)+ 匹配 "ab"、"abab" |
3. 贪婪与非贪婪
.*------ 贪婪匹配:尽可能多地匹配字符.*?------ 非贪婪匹配:尽可能少地匹配字符
示例 :文本为 <div>hello</div><div>world</div>
<div>.*</div>匹配整个字符串(贪婪)<div>.*?</div>分别匹配<div>hello</div>和<div>world</div>(非贪婪)
实战建议 :大多数场景使用非贪婪
.*?更安全,避免匹配过多内容。
4. 捕获组与替换引用
- 查找中用
()捕获内容 - 替换中用
$1、$2引用第 1、第 2 个捕获组
示例 :将 2026-11-02 转为 02/11/2026
- 查找:
(\d{4})-(\d{2})-(\d{2}) - 替换:
$3/$2/$1
二、数据清洗实战
场景1:删除所有空行
查找:
`^\s* $ \r?\n`
替换:(留空)
\s*匹配零个或多个空白字符,\r?\n匹配换行符(兼容 Windows 和 Unix 格式)。
场景2:删除行首/行尾空格
删除行首空格:
- 查找:
^\s+ - 替换:(留空)
删除行尾空格:
- 查找:
\s+$ - 替换:(留空)
场景3:CSV 列顺序调整
原始数据(姓名,年龄,城市):
张三,25,上海
李四,30,北京
调整为(城市,姓名,年龄):
- 查找:
([^,]+),([^,]+),([^,\r\n]+) - 替换:
$3,$1,$2
结果:
上海,张三,25
北京,李四,30
场景4:提取邮箱地址
从混合文本中提取所有邮箱:
- 查找:
[\w.+-]+@[\w-]+\.[\w.-]+ - 替换:
$0\n
$0代表整个匹配内容,\n确保每个邮箱单独一行。
场景5:手机号脱敏
将 13812345678 替换为 138****5678:
- 查找:
(\d{3})\d{4}(\d{4}) - 替换:
$1****$2
三、日志分析实战
场景1:提取 IP 地址
从服务器日志中提取所有 IP:
- 查找:
\b(?:\d{1,3}\.){3}\d{1,3}\b - 替换:
$0\n
\b是单词边界,确保不会匹配到类似1234.5.6.789的无效内容。
场景2:提取时间戳
从日志行 2026-11-02 14:30:25 [ERROR] ... 中提取时间:
- 查找:
(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2}) - 替换:
$1 $2\n
场景3:筛选包含关键词的行
保留包含 "ERROR" 或 "Exception" 的行,删除其他行:
- 先标记目标行:
- 查找:
^(.*(ERROR|Exception).*)$ - 替换:
###KEEP###$1
- 查找:
- 删除未标记的行:
- 查找:
^(?!###KEEP###).*\r?\n - 替换:(留空)
- 查找:
- 去除标记:
- 查找:
###KEEP### - 替换:(留空)
- 查找:
场景4:统计错误码出现次数
将日志中的错误码提取出来,每行一个,方便用 Notepad++ 的搜索 → 统计功能计数:
- 查找:
ERROR_CODE[:=]\s*(\d+) - 替换:
$1\n
四、代码批量修改实战
场景1:批量注释代码行
在选中区域每行前添加 // :
- 查找:
^(.+)$ - 替换:
// $1
注意:先在 Notepad++ 中选中要注释的行,然后在搜索 → 在以下项中查找 → 当前选中内容中执行替换,避免影响其他代码。
场景2:Python 变量名批量重命名
将 user_name 改为 userName(下划线转驼峰):
- 查找:
_(\w) - 替换:
\U$1
\U将下一个字符转为大写。多次执行可处理多个下划线。
场景3:JSON 键名加引号
将未加引号的 JSON 键名加上双引号:
- 查找:
(\w+)\s*: - 替换:
"$1":
场景4:HTML 标签属性提取
从 <img src="photo.jpg" alt="风景" /> 中提取 src 值:
- 查找:
<img[^>]*src="([^"]+)" - 替换:
$1\n
场景5:SQL 语句格式化
将 SELECT id, name, age FROM users WHERE age > 18 转为多行:
- 查找:
(SELECT|FROM|WHERE|ORDER BY|GROUP BY) - 替换:
\n$1
五、高级技巧
1. 前瞻与后顾(Lookahead / Lookbehind)
正向前瞻 (?=...):匹配后面跟着某内容的文本,但不包含该内容。
示例:匹配后面跟着 "元" 的数字:
- 查找:
\d+(?=元) - 匹配 "100元" 中的 "100",但不包含 "元"
负向前瞻 (?!...):匹配后面不跟着某内容的文本。
示例:匹配不以 "test" 开头的行:
- 查找:
^(?!test).*$
2. 条件替换
Notepad++ 不支持真正的条件替换,但可以通过多次替换实现类似效果。
例如,将 true 替换为 1、false 替换为 0:
- 第一次:查找
true,替换1 - 第二次:查找
false,替换0
3. 跨行匹配
勾选 ". 匹配新行" 后,[\s\S]*? 可以匹配任意字符(包括换行符)。
示例:提取两个标记之间的多行内容:
- 查找:
<!-- START -->([\s\S]*?)<!-- END --> - 替换:
$1
4. 反向引用去重
删除连续重复的行:
- 查找:
^(.+)\r?\n\1$ - 替换:
$1
注意:此方法仅删除相邻的重复行。删除所有重复行需借助插件或多次操作。
六、正则调试技巧
1. 小步测试
不要一次性写复杂的正则。先在 Notepad++ 中用查找 (Ctrl + F)测试匹配是否正确,确认无误后再执行替换。
2. 使用"在以下项中查找"
对于危险操作,先在当前选中内容 或当前文档中测试,避免误操作整个项目。
3. 备份原文件
执行批量替换前,务必 Ctrl + S 保存当前状态,或复制一份备份文件。Notepad++ 的撤销 (Ctrl + Z)可以回退替换操作,但备份更保险。
4. 利用搜索标记
在查找窗口中点击**"在以下项中查找 → 标记"**,可以高亮所有匹配项,直观检查正则是否正确。
七、常用正则模板速查表
| 场景 | 正则表达式 |
|---|---|
| 邮箱 | [\w.+-]+@[\w-]+\.[\w.-]+ |
| 手机号(中国大陆) | 1[3-9]\d{9} |
| IP 地址 | \b(?:\d{1,3}\.){3}\d{1,3}\b |
| URL | https?://[\w./?&=#-]+ |
| 日期(YYYY-MM-DD) | \d{4}-\d{2}-\d{2} |
| 时间(HH:MM:SS) | \d{2}:\d{2}:\d{2} |
| 中文 | [\u4e00-\u9fa5]+ |
| 空白行 | ^\s*$ |
| HTML 标签 | <[^>]+> |
| Markdown 链接 | \[([^\]]+)\]\(([^)]+)\) |
八、常见问题解答
Q1:Notepad++ 的正则和 Python/JavaScript 的一样吗?
大部分语法通用,但 Notepad++ 基于 Scintilla 的 PCRE 引擎,不支持部分高级特性(如命名捕获组 (?P<name>...))。日常使用完全够用。
Q2:为什么我的正则匹配不到内容?
- 检查是否勾选了**"正则表达式"**模式
- 检查是否勾选了**"匹配大小写"**(默认不区分)
- 检查是否勾选了**". 匹配新行"**(跨行匹配时需要)
- 尝试用标记功能高亮匹配项,排查问题
Q3:替换后内容全乱了怎么办?
立即按 Ctrl + Z 撤销。Notepad++ 支持多步撤销,可以逐步回退。
Q4:如何学习更复杂的正则?
推荐以下资源:
- regex101.com ------ 在线正则测试工具,支持 PCRE 语法,实时解释每个字符的含义
- Notepad++ 官方文档 ------ 查看支持的正则语法详情
- 从本文的模板出发,逐步修改和组合,在实践中掌握
结语
正则表达式不是程序员的专属技能。无论是整理数据、分析日志,还是批量修改代码,正则都能让你从重复劳动中解放出来。
建议从本文的常用正则模板速查表开始,遇到类似场景直接套用。用多了,你会发现正则并没有想象中那么难------它只是一套更精确的"查找规则"而已。