【问题标题】:restrict number with decimals in between限制数字之间有小数
【发布时间】:2017-04-17 12:27:00
【问题描述】:

我正在尝试验证中间有小数的数字是否在允许前导零的 0-255 范围内。

到目前为止,我已经想出了正则表达式

^0*([1-9][\.\d]|250)*

我尝试过的示例是 63.32.32.250,但它只抓取 63,而不是字符串的其余部分。

我认为 [\.\d] 会包含所有句点,但事实并非如此。

我在这里做错了什么?谢谢

【问题讨论】:

  • 您是否要为 IPV4 地址创建正则表达式?
  • 不,我并不是真的想为 IPV4 地址创建一个正则表达式,只是为任何带有 3 个小数点和 4 个数字的随机数字地址。我查看了建议的链接,这些正则表达式似乎特别长。也许有更优雅的解决方案?
  • 一个由. 分隔的数字地址,其值介于 0 和 255 之间。嗯,这似乎非常接近 IPv4 ...您应该使用您知道的相同逻辑。并检查SO,有正则表达式的植物,像这样的范围并不简单是正则表达式。但是你可以拆分String并检查数值范围

标签: java regex


【解决方案1】:

为此使用正则表达式不是一个好主意,您可以像这样使用InetAddressValidator

InetAddressValidator.getInstance().isValid(YOUR_IP_HERE)

顺便说一句,你也可以使用isValidInet4Address 方法。

【讨论】:

    【解决方案2】:

    Federico Piazza 的答案更好,但如果你想手动完成,我会考虑使用拆分功能并使用 >

    String[] numbers = "63.32.32.250".split("\\.");
    for(String number: numbers){
       -> parse number string to an int
       -> check its in right range just with ><=
    }
    

    希望有帮助

    【讨论】:

    • Split 方法将正则表达式作为参数。您必须使用\\. 转义点。如果您不拆分它,您的数组将包含 12 个空值
    • @FedericoPiazza 如果您使用.,它将是一个零长度数组,因为不返回尾随空字符串。
    • @AndyTurner,真的...以为它会多次拆分
    • @FedericoPiazza 如果你打电话给split(".", -1)
    【解决方案3】:

    有缺陷的作品

    要验证 IPv4 地址,您可以执行类似的操作

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

    Debuggex Demo

    但这有一个致命的缺陷,就是不检查数字是否在 1-255 之间

    作品

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

    Debuggex Demo

    【讨论】:

      【解决方案4】:

      对于一组数字:

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

      对于四组,重复:

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

      这将捕获四个组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        相关资源
        最近更新 更多