直接写 ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ 会匹配非法ip,因 \d{1,3} 允许 0–999 范围,无法限制每段为 0–255;需分段用 (25[0-5]|20-4|[01]?0-9?) 精确约束。

为什么直接写 ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ 会匹配到非法IP
这个正则看似能抓出四段数字加点的结构,但实际会匹配到 999.999.999.999 或 0.0.0.000 这类根本不是合法IP的字符串。Sublime 的正则引擎不支持条件判断或回溯引用限制,所以必须靠分段约束每个字节的取值范围(0–255),不能偷懒用 \d{1,3}。
匹配单个合法IPv4地址的推荐正则表达式
在 Sublime 中启用「Regular Expression」模式(Alt+R 或右下角点击「.*」),使用以下表达式:
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
说明:
-
25[0-5]覆盖 250–255 -
2[0-4][0-9]覆盖 200–249 -
[01]?[0-9][0-9]?覆盖 0–199(注意:它允许单独的0,也允许00、01,这是 Sublime 查找场景中可接受的宽松匹配;如需严格禁止前导零,需额外处理) - 每段之间用字面量
\.连接,不能漏掉反斜杠
在日志或混排文本中提取所有IP(非行首行尾限定)
如果目标不是整行匹配,而是从 GET /api?ip=192.168.1.1 HTTP/1.1 这类文本里抽IP,要去掉 ^ 和 $,并加单词边界防止误匹配(比如避免把 123.456.789.0123 中的 23.456.789.01 截出来):
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
注意点:
- Sublime 不支持
\b对 Unicode 的完整支持,但在纯 ASCII IP 场景下足够可靠 - 如果文本含 IPv6 或 CIDR(如
192.168.1.1/24),该正则仍会匹配前半部分;需要排除斜杠可追加负向先行断言:(?!/)放在末尾\b前 - 匹配结果中,整个IP是
$0,各段分别对应$1到$4,可用于替换(例如转成 CSV)
常见失败原因和调试建议
粘贴正则后没效果?大概率是这几个问题:
- 忘记开启正则模式 —— 确认右下角显示
.*,不是AB(文字)或\(literal) - 复制时带了全角符号或换行 —— 建议在纯文本编辑器里先清理再粘贴
- 想匹配带端口的
192.168.1.1:8080却没加:[0-9]{1,5}—— 但这样会破坏IP独立性,建议分两步:先提IP,再用另一条规则找端口 - 文件编码为 UTF-16 或含 BOM —— Sublime 有时对正则的边界识别异常,可先用「File → Reopen with Encoding → UTF-8」重载
真正麻烦的是那些嵌套在 JSON 或 URL 编码里的 IP,比如 %31%39%32%2E%31%36%38%2E%31%2E%31,这种得先解码再匹配,正则本身无能为力。











