如何为域列表创建正则表达式?

时间:2009-06-19 18:11:00

标签: regex

这是用于文本框验证。我需要匹配域名列表

匹配

  

google.com,msn.com,texas.edu.gov.us

     

msn.com

NON-MATCHES

  

google.com,msn.com,

     

@ msn.com,@ google.com

     

test@test.com

没有尾随逗号(这就是我被卡住的地方)

这是我到目前为止所用的,但逗号分隔的部分不能正常工作:

^([([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}]+\s*)+,$

2 个答案:

答案 0 :(得分:2)

在我看来,你最好首先使用\s*,\s*这样的正则表达式将字符串拆分,然后单独验证每个域。如果您稍后尝试更改逻辑,尝试将其全部推入单个正则表达式将使您的生活变得艰难。

验证正则表达式的域名应该有效。我不知道您是否故意禁止某些有效域名。更通用的域匹配正则表达式将是:

^[\w-]+(\.[\w-]+)+$

但即便是这个也不允许localhost,在您的情况下可能允许或不允许[\w-]+。对于其他方面的规格来说太松了。可选择将[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?替换为^\s*([\w-]+(\.[\w-]+)+\s*,\s*)*[\w-]+(\.[\w-]+)+\s*$ 以获得更严格和更多混淆 - 尽管仍然不会使仅限数据的记录失效,这些记录根据规范无效。你需要它到底有多精确?

根据我上面的示例正则表达式忽略关于拆分字符串的内容,你可以使用以下怪物来匹配域名列表:

{{1}}

答案 1 :(得分:2)

“有些人在遇到问题时会想”我知道,我会使用正则表达式。“现在他们有两个问题。”   - 杰米·扎温斯基

这是一个正如你想要的正则表达式。它将处理以逗号分隔的域列表,确保域名中没有非法字符,并强制执行域名长度(我认为它不是61,但是你有61个,所以我离开了)

^ \ S *(([A-ZA-Z0-9] [A-ZA-Z0-9 - ]。{0,61} [A-ZA-Z0-9]([A-ZA- Z0-9] {2,6-})+)+ \ S *,\ S *)*([A-ZA-Z0-9] [A-ZA-Z0-9 - ] {0,61} [A- ZA-Z0-9]([A-ZA-Z0-9] {2,6-})+)$

*注意[a-zA-Z0-9]用于代替[\ w],因为下划线包含在\ w中但在域名中不允许