【问题标题】:Regex numeric range with no leading zeros没有前导零的正则表达式数字范围
【发布时间】:2013-01-20 22:39:06
【问题描述】:

我正在尝试验证此模式:

1.1.1.1 到 254.254.254.254,但没有前导零。所以 001.001.001.001 不应该匹配。

我有

/^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-4])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-4])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-4])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-4])$/

但这匹配前导零。谁能推荐如何解决这个问题?

【问题讨论】:

    标签: regex


    【解决方案1】:

    每个元素将是:

    [1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]
    

    零件分解:

    (1-99)      (100-199)   (200-249)   (250-254)
    

    哦,还有一件事我要提一下……您需要处理第二、第三和第四位的号码0。因此,只需在这些组中为单个 0 数字添加一个额外选项。我认为将零作为 IP 地址中的第一个数字是无效的(尽管如果它是掩码则有效)。

    【讨论】:

    • 最接近答案的东西,但它也没有验证。 regex101.com/r/xI8yF2 只抢了 254 中的 25
    • 你没有在它周围加上括号。您必须将^$ 放在括号外,其余放在括号内。与您原来的问题相同。
    • 请注意,我已经编辑了我的答案,指出您仍然需要处理 0 - 假设您正在尝试识别 IP 地址。
    【解决方案2】:

    对于这样的重复模式,使用编号重复很方便。以下内容应与您所追求的相匹配

    ([1-9]\d{0,3}\.){3}[1-9]\d{0,3}
    

    编辑:我睡着了,错过了上限为 0.254 的部分。有机会我会更新的。

    【讨论】:

    • 在睡梦中写正则表达式是硬核!
    • 上限是我最初尝试过的最难的部分,但它需要一个上限并且没有前导零
    【解决方案3】:

    这应该可以工作

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

    【讨论】:

    • 谢谢,但没有验证,另外,你似乎在使用重复的反向引用,在这种情况下它不起作用,它需要像 IP 地址regex101.com/r/xT5qS7 一样验证 1-254
    • 我不知道你在哪里测试过,但是如果你在 Notepad++ 中尝试一下,它会工作的。
    【解决方案4】:

    试试这个。

    ([1-9]$|[1-9][0-9]$|[12][0-9][0-9]$)\.([0-9]$|[1-9][0-9]$|[12][0-9][0-9]$)\.([0-9]$|[1-9][0-9]$|[12][0-9][0-9]$)\.([1-9]$|[1-9][0-9]$|[12][0-9][0-9]$)

    【讨论】:

    • ^(([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-4 ])\.([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.([ 1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.([1-9][0 -9]?|1[0-9]{2}|2[0-4][0-9]|25[0-4])$)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2019-05-29
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多