正则表达式以验证URL或域名.

Rod*_*Rod 2 javascript c# regex

有人可以让我知道我的正则表达式有什么问题吗?我只想验证URL的开头,主要是主机名(即www.yahoo.com).

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 
Run Code Online (Sandbox Code Playgroud)

这应该返回false,而是返回任何内容,使用javascript和c#...如果你删除了对子域大小的{1,63}限制,它可以工作......

Kob*_*obi 5

你创造了一个灾难性的模式 - 引擎将尝试以([a-zA-Z0-9\-\.]{1,63})+多种方式匹配,直到它失败.一个简单的解决方案是删除{1,63},正如您所指出的,它似乎似乎没有添加任何东西.
另一种选择是使用点作为锚点,因此你不能在它们之间回溯(这只会给你一种方法来匹配文本,并且可以说,你正在尝试做什么):

([a-zA-Z0-9\-]{1,63}\.)*[a-zA-Z0-9\-]{1,63}
Run Code Online (Sandbox Code Playgroud)

请记住,在域名中假设所有ASCII-English字母不再是非常正确的.例如,http://???.???是一个合法(和工作)网址.