【问题标题】:IPv4, IPv6, & hostname regexIPv4、IPv6 和主机名正则表达式
【发布时间】:2014-11-02 05:22:48
【问题描述】:

我正在 GWT 中进行字段验证。我有一个巨大的正则表达式(gwt 只支持 Java 正则表达式的一个子集),它可以成功地检测 ipv4、ipv6 和主机名。

www.google.com

192.168.1.1

2001:0db8:85a3:0000:0000:8a2e:0370:7334

我也需要它来接受上述的 csv,但我无法弄清楚。我可以让它接受 1 种类型的 csv,但不能在它们互换时接受。

IE:1.2.3.4,5.6.7.8 有效

但不是1.2.3.4,2001:0db8:85a3:0000:0000:8a2e:0370:7334

我很接近,我知道正则表达式是一个怪物,但有人可以帮忙吗?

private static final String IPV6_IPV4_HOSTNAME_VALIDATION_REGEX = ""
+ "^(((([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]))(\\,)?)*$|^((([a-zA-Z]"
+ "|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])(\\,)?)*$"
+ "|^((?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]"
+ "|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))"
+ "|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]"
+ "|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))"
+ "|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))"
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))"
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))"
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))"
+ "|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))(\\,)?)*$";

【问题讨论】:

  • 即使你让它工作,这个正则表达式也将无法维护。为什么不将其拆分为多个正则表达式,然后在 Java 代码中依次应用它们?
  • 请记住,域名实际上以点结尾,这是可选的(通常被省略)。另外,不要忘记64:ff9b::198.252.206.16 之类的 IP。

标签: java javascript regex gwt


【解决方案1】:

回到语法,正则表达式将随之而来。

list := part ( ',' part)*

part := ipv4 | ipv6 | hostname

现在将“类似于 ABNF”的语法翻译成 Java:

private static String IPV4 = "…";
private static String IPV6 = "…";
private static String HOSTNAME = "…";

private static String PART = "(?:" + IPV4 + "|" + IPV6 + "|" + HOSTNAME + ")";
private static String LIST = "^" + PART + "(?:," + PART + ")*$";

注意:您应该对 IPv4、IPv6 和主机名的匹配应用相同的推理。

【讨论】:

  • 真棒@Thomas 我应该想到这一点,而不是单独操作正则表达式并处理字符串变量。当我尝试一个小时左右时,我会接受。谢谢大家,我也尝试了其他人建议的字符串拆分,但它不起作用我需要正则表达式来解析整个字段,你不能说循环遍历逗号分隔值并验证每个值,它是整个字段一次。
【解决方案2】:

我不熟悉 GWT,但也许您可以使用 String.split(",") 将地址拆分为一个数组,然后修剪并将验证正则表达式应用于数组中的每个项目。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 2012-03-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多