因为\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}未校验每段0–255范围,会误匹配999.999.999.999等非法值,且缺乏边界保护,易在192.168.1.1000中错提192.168.1.100。

为什么 ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 常常匹配失败
日志里 IP 出现在行首时,这个正则看似合理,但实际会漏掉大量有效地址。根本原因是:IP 段数字范围没做校验(比如 999.999.999.999 也能过),且没处理常见干扰——前面可能有时间戳、空格、方括号、冒号等。Sublime 的正则引擎不支持 \b 在 Unicode 边界上的稳定行为,所以单纯靠单词边界不可靠。
实操建议:
- 用
(? 替代,<code>(? 和 <code>(?!\d)能准确排除前后连着数字的情况(如192.168.1.100abc中的 IP 不会被截断) - 如果日志含 IPv6 或 CIDR(如
192.168.1.1/24),先确认是否需要保留掩码;需要就加(?:/\d{1,2})?到末尾 - 开启 Sublime 的
Regex模式(右下角点「.*」图标)和Wrap Around,避免漏掉文件末尾匹配
如何一次性提取所有唯一 IP 并去重
Sublime 本身不提供去重功能,但可以借助正则 + 排序组合实现。关键在于先“提纯”再“整理”,而不是指望一次替换完事。
实操建议:
- 第一步,用
(? 全局查找,按 <code>Ctrl+D(Windows/Linux)或Cmd+D(macOS)逐个选中,然后Ctrl+Shift+P→ 输入Sort Lines→ 回车;或者复制所有匹配项到新标签页再排序 - 第二步,用正则替换去重:
^(\d{1,3}(?:\.\d{1,3}){3})$\n\1$→\1,配合Regular Expression和Whole Word,反复执行直到无变化(注意:此法仅适用于已排序列表) - 更稳的方式是导出后用命令行:选中全部匹配结果 → 右键
Copy→ 终端执行pbpaste | sort -u(macOS)或clip.exe | sort | uniq(Windows WSL)
遇到 [::1] 或 127.0.0.1:8080 怎么办
真实日志常混着本地回环、带端口、IPv6、甚至 URL 格式(如 http://10.0.0.5)。硬套 IPv4 正则会丢数据,全放开又容易误抓(比如把 256.1.2.3 当合法 IP)。
实操建议:
- 若需兼容端口,扩展为
(?,但要注意 <code>:前后不能是字母或斜杠(否则会抓到https://) - IPv6 提取成本高,Sublime 对
[a-f0-9:]+类模式支持弱,且易与日志中的方括号时间戳(如[2024-05-01])冲突;建议先用\[([0-9a-fA-F:]+)\]单独捕获中括号内内容,再人工筛 - 若日志格式固定(如 Nginx 的
$remote_addr字段总在特定位置),优先用列选择(Ctrl+Shift+↑/↓)或按分隔符切列,比正则更准
替换后出现乱码或换行错位怎么办
Sublime 在正则替换中若使用了 \n 或 $0 等引用,而源文件是 Windows(\r\n)或 Mac(\r)换行,容易导致行尾异常。这不是编码问题,而是换行符隐式替换引发的错位。
实操建议:
- 替换前先统一换行符:菜单
View → Line Endings → Unix (LF),避免\n与\r\n混用 - 避免在替换字段中直接写
\n;如需换行分隔,用$0\n而非$0\r\n,让 Sublime 自动适配当前文档换行格式 - 如果替换后某行变空或缩进异常,大概率是原日志中 IP 前后有不可见字符(如
\t或零宽空格),可先用[\s\u200B-\u200F\uFEFF]+清理空白符再提取











