通配符域验证器

时间:2014-07-07 14:51:01

标签: java regex validation

我将在我的应用程序中添加通配符支持。

应符合以下要求。通配符必须包含:

 - UTF-8 alphabetical characters
 - .,*,^,+,?,$,[],[^],:,/
 - Domain parts other than the last may begin with a digit(from RFCs)

用户也可以将简单域名指定为test.test

这个想法是分两步完成的:

  1. 验证通配符是否与下面的模式匹配:

    ^[\\pL0-9\\[\\].^$?*+:/]+。如果匹配则尝试编译为java模式。

  2. 如果它与上一个正则表达式不匹配,则假设这是一个简单的域名,并使用谷歌库com.google.common.net.InternetDomainName验证它
  3. 但我不确定最后一种方法是否涵盖所有可能的情况

    例如,当我像这样指定域时: test.10它与模式匹配,但不符合域中数字的第三个要求。

    如果您的建议解释了如何满足所有定义的要求,那将是一件好事。在这种情况下,了解更好的解决方案也是一件好事。

1 个答案:

答案 0 :(得分:1)

如果域的最后一部分不应包含任何数字:

^(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+[\x2E])+[\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+$

上面的正则表达式为Java String:

"^(?:[\\p{L}\\p{Nd}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+[\\x2E])+[\\p{L}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+$"

如果只有域的最后一部分的第一个字符不应该是数字:

(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+[\x2E])+[\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E][\p{L}\p{N}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+

上面的正则表达式为Java String:

"(?:[\\p{L}\\p{Nd}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+[\\x2E])+[\\p{L}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E][\\p{L}\\p{N}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+"