2011-05-23 96 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://אתר.קום是一个合法的(和工作)网址。