2011-05-23 40 views
2

有人可以讓我知道我的正則表達式有什麼問題嗎?我試圖驗證網址的開頭,主要是主機名(即www.yahoo.com)。正則表達式驗證URL或域名。

Regular Expression: ^(((ht|f)tp(s?))\:\/\/)?(www.)?([a-zA-Z0-9\-\.]{1,63})+\.([a-zA-Z]{2,5})$ 

Testing Values: 

test.com – passes 

test.c2om – fails 

test.test.com – passes 

test.test.c2om – fails 

test.test.test.com – passes 

test.test.test.c2om – INVALID REGEX PATTERN 

這應該返回false,而是返回任何內容,使用JavaScript和C#都...如果你刪除的子域的大小{1,63}的限制,它的工作原理...

回答

5

您已經創建了一個catastrophic pattern - 引擎將嘗試以多種方式匹配([a-zA-Z0-9\-\.]{1,63})+,直至失敗。一個簡單的解決方案就是刪除{1,63},正如你所指出的,它似乎並沒有增加任何東西。
另一種選擇是使用點作爲錨,所以你不能在它們之間原路返回(這只是給你的文字匹配的一種方式,而assumably,你正在做什麼):

([a-zA-Z0-9\-]{1,63}\.)*[a-zA-Z0-9\-]{1,63} 

保持記住,在域名中使用全ASCII-English字母不再是非常正確的了。例如http://אתר.קום是一個合法的(和工作)網址。