快速入门
教程
工具和语言
示例
参考
书籍评论
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期转文本
信用卡号
匹配完整行
删除重复行
编程
两个相邻单词
陷阱
灾难性回溯
重复过多
拒绝服务
使所有内容都可选
重复捕获组
混合 Unicode 和 8 位
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书籍评论
可打印 PDF
关于本网站
RSS 提要和博客
RegexMagic—Generate regular expressions matching ip addresses and ranges

如何查找或验证 IP 地址

匹配 IP 地址是正则表达式复杂性和准确性之间权衡的另一个好例子。 \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 将完全匹配任何 IP 地址。但它也会将 999.999.999.999 匹配为有效的 IP 地址。如果你的正则表达式风格支持 Unicode,它甚至可以匹配 ١٢٣.१२३.೧೨೩.๑๒๓。这是否是一个问题取决于你打算将正则表达式应用于哪些文件或数据。

限制和捕获四个 IP 地址数字

若要将 IP 地址中的所有 4 个数字限制为 0..255,你可以使用以下正则表达式。它将 IP 地址的 4 个数字中的每一个存储到一个 捕获组 中。你可以使用这些组进一步处理 IP 号码。 自由间距模式 允许它适应页面的宽度。

\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

上述正则表达式允许数字 10 到 99 有一个前导零,数字 0 到 9 有两个前导零。严格来说,带有前导零的 IP 地址表示八进制表示法。因此,你可能希望禁止前导零。这需要一个稍长的正则表达式

\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.
  
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b

限制四个 IP 地址数字而不捕获它们

如果你不需要访问各个数字,你可以使用 量词 将上述 3 个正则表达式缩短为

\b(?:\d{1,3}\.){3}\d{1,3}\b

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
  
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
  
(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b

检查用户输入

上述正则表达式使用单词边界以确保 IP 地址中的第一个和最后一个数字不属于更长的字母数字字符序列的一部分。这些正则表达式适用于在较长的字符串中查找 IP 地址。

如果您想通过确保字符串仅由 IP 地址组成来验证用户输入,那么您需要用字符串开始和结束锚点替换单词边界。如果您的正则表达式风格支持,您可以使用专用锚点 \A\z

\A(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
  
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\z

如果没有,您将必须使用 ^$,并确保它们在换行符处匹配的选项已关闭

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
 (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$