用于验证IP列表中的IP范围的正则表达式

4
我有一个正则表达式,用于验证由逗号分隔的50个IP地址列表:
^(?:(?:(?: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]?)(?:,? ?)){1,50}$

列表示例:
10.10.10.1,127.0.0.1

现在我需要支持列表,就像这样:
10.10.10.1,127.0.0.1-127.0.0.125

我尝试使用子模式,但没有任何反应。请问有人可以提供一个验证此字符串的正则表达式示例吗?
127.0.0.1-127.0.0.125

逗号,或破折号-可以出现在字符串的开头吗?您当前的方法允许这种情况。 - Wiktor Stribiżew
::1 是什么情况? - CD001
@WiktorStribiżew 不,你的答案是正确的! - kRicha
@CD001 你是什么意思? - kRicha
我认为使用正则表达式会非常困难。我会使用CSV解析器,然后在“-”上分割,使用ip2long比较值,如果结束小于开始,则抛出错误。 - chris85
显示剩余5条评论
1个回答

4

这里有两种方法:使用否定字符类来匹配 ,-,并使用子例程调用以确保您的模式保持合理大小且字符串不能以 ,- 开头:

^((?:(?: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]?))(?:[,-](?1)){0,49}$

请查看正则表达式演示 细节:
  • ^ - 字符串的开头
  • ((?:(?: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]?)) - 第1组捕获1个IP地址
  • (?:[,-](?1)){0,49} - 0至49个子模式的匹配,如上面的子模式已经匹配了一个IP地址,因此总共有50个:
    • [,-] - 匹配,-的字符类
    • (?1) - 子程序调用,"重复"第1组的子模式(与反向引用不同,它匹配具有捕获组的相同值)
  • $ - 字符串的结尾

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接