用于验证ip-list的ip-range的正则表达式

时间:2016-11-28 15:09:49

标签: php regex pcre

我有正则表达式来验证50个以逗号分隔的列表:

^(?:(?:(?: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

1 个答案:

答案 0 :(得分: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}$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • ((?:(?: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(因为上面的子模式已经匹配1个IP,它总共将总计50个)序列:
    • [,-] - 与,-
    • 匹配的字符类
    • (?1) - “重复”第1组子模式的子例程调用(与匹配使用捕获组捕获的相同的反向引用不同)
  • $ - 字符串结尾