2014-09-10 56 views
1

我在正則表達式很糟糕。只是不好。我以爲我很體面,但沒有。我只是不好。量詞不起作用

從我的胸腔中,我們如何在整個前面的組中完成{1,61}量詞的工作?

^((xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?){1,61}(\.[a-zA-Z]{2,})?$ 

這裏是RegExr

順便說一句,這是一個域名模式。

+2

你試圖匹配什麼?比如,什麼是*應該*匹配(以及爲什麼)的事情的例子,以及不應該(和爲什麼)的事情?我可以觀察到,你的'{1,61}'限定詞的格式不匹配。 – Pointy 2014-09-10 23:54:34

+0

看看RegExr告訴你什麼:你的第一組匹配整個事情。它說,「匹配字符串'xn-'或任何一個或多個字母數字字符序列」。這是整個搜索字符串。 – Pointy 2014-09-10 23:56:42

+0

@Pointy好吧,一個域可以看起來像這樣:'aaa'或'aaa-aaa'或'xn - aaa'。這應該是最多61個字符。 – Birowsky 2014-09-11 00:06:16

回答

2

由於{1-61}適用於上一組,它本身由1 或更多字符組成,所以表達式不起作用。

下面是一個使用正向前查找答案由@Casimir評論:

^(?=.{1,61}$)((xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?)(\.[a-zA-Z]{2,})?$ 

需要注意的是,如果你想匹配的域名,你真的應該匹配在名稱a max of 63 characters,不包括點-TLD。上面的表達式將匹配整個名稱的最大61,包括dot-tld,因此它將禁止使用有效的名稱。也許這更接近你想要的:

^(?=[^\.]{1,63}\.)(xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?(\.[a-zA-Z]{2,})?$