2016-02-29 60 views
0

这就是我想要的匹配:这个正则表达式可以改进吗?

this_is.ok.com 
this_is.another_valid.domain.com 

这里有一些字符串我不想匹配:

this_one.is_not_ok.com 
not_ok.com 
also.not_ok 

任何部分即可以有下划线,除了的最终或倒数第二部分。

我想出正则表达式:

^([a-zA-Z0-9-_]{0,63}?\.)*([a-zA-Z0-9-]{0,63}?\.){1}([a-zA-Z0-9-]{0,63}?){1}$ 

它似乎工作,但我觉得它可能会更好。

注意:请不要讨论域名中的下划线。只需评论正则表达式。

+0

您正在使用哪种正则表达式实现? –

+0

**你的意思是**最终和倒数第二部分**? – anubhava

+0

somepart.anotherpart.penultimatepart.ultimatepart –

回答

1

您可以使用此重构和更小的正则表达式:

^([\w-]{1,63}?\.)*([a-zA-Z0-9-]{1,63}\.)([a-zA-Z0-9-]{2,63})$ 

RegEx Demo

的变化是:

  • \w - 短切为[a-zA-Z0-9_]
  • 必须保持连字符的第一个或最后一个在字符类中的位置
  • {1}是不必要的,应取出
  • {0,63}至少应为{1,63}

注意,相比于通过您的正则采取124步这个重构的正则表达式呈现regex101网站106步。

0

假设 “改良” 是指 “缩短”:

^(\w+\.)+\p{L}+\.\p{L}+$ 

参见live demo

相关问题