2016-02-29 65 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

相關問題