【问题标题】:regex for multiple IPs comma separated with or without subnet多个 IP 的正则表达式,逗号分隔,有或没有子网
【发布时间】:2017-09-14 08:24:33
【问题描述】:

我有 IPv4 地址的正则​​表达式:

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5 ]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0 -5])$

我有 IPv4 CIDR 范围的正则​​表达式:

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5 ]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0 -5])(/([0-9]|[1-2][0-9]|3[0-2]))$

问题是我应该如何使用逗号分隔来重复它

图案:

XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX/XX, XX.XX.XX.XX, XX.XX.XX.XX/X, XX.XX.XX.X 测试数据--

123.123.13.11, 1.0.0.0, 1.0.0.1/3, 1.0.0.0/20

我正在使用http://regexr.com/ 通过正则表达式构建, 我构建的正则表达式在下面并且不起作用--

/(((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))),?)/g

【问题讨论】:

  • 用逗号分割,循环并使用你已有的正则表达式。
  • 这不起作用- /((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]|[ 0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01 ]?[0-9][0-9]?),?)/g;

标签: javascript angularjs regex validation angularjs-ng-pattern


【解决方案1】:

使用()* ex (<regex>)* 循环环绕正则表达式,如果匹配开始和结束,则将终止符移出循环,如^(regex)*$

要匹配, 或行尾附加([,\s]+|$) 如果您不想要空格,则排除\s+ 表示匹配一个或多个。

这应该适合您匹配整个字符串。删除有效部分末尾的*;用 ^ $ 包围以匹配完整的字符串。

IPV4 = (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
Optional subnet = (\/([4-9]|[12][0-9]|3[0-2]))?
coma or end of line = (,|$)
Putting it together = (((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([4-9]|[12][0-9]|3[0-2]))?)([,\s]+|$))*

或者,对于最小组匹配((?!\\/) 是负向预测/,并非所有正则表达式引擎都支持负向预测)

(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]?)(\/(3[0-1]|2[0-9]|1[0-9]|[4-9]))?(?!\/)\b

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    /((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]?)(\/(3[0-1]|2[0-9]|1[0-9]|[4-9]))\,?\b){1,}/g
    

    编辑:细分

    匹配一个 IP 地址:

       (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]?)
    

    (\/(30|2[0-9]|1[0-9]|[4-9]))? / 后跟一个介于 4 到 31 之间的数字。

    \,? 逗号。可选。

    ? 空格。可选。

    \b词尾。

    ){1,} 捕获组结束。至少一次。

    【讨论】:

    • 但它与子网不匹配。在斜杠(/)之后只允许使用数字。
    • 你是对的。修改它以支持子网掩码。是你要找的吗?
    • 样本未验证 151.140.0.0/16,165.130.0.0/16,50.207.27.182/32,192.8.0.0/16,207.11.0.0/17,50.202.130.24/29
    • 关于第一个字符串,每个子网上应该只有 30 台主机。无论如何,让它上升到 32 是非常简单的,只需将 30 替换为 3[0-2] 另一方面,除非您假设每个 IP 地址都会附带,否则您将需要第二次检查一个子网。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多