有人可以让我知道我的正则表达式有什么问题吗?我只想验证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
这应该返回false,而是返回任何内容,使用javascript和c#...如果你删除了对子域大小的{1,63}限制,它就可以...
答案 0 :(得分:5)
您已创建catastrophic pattern - 引擎将尝试以多种方式匹配([a-zA-Z0-9\-\.]{1,63})+
,直至失败。一个简单的解决方案是删除{1,63}
,正如您所指出的那样,它似乎并没有添加任何内容。
另一个选择是使用点作为锚点,因此你不能在它们之间回溯(这只会给你一种方法来匹配文本,并且可以说,你正在尝试做什么):
([a-zA-Z0-9\-]{1,63}\.)*[a-zA-Z0-9\-]{1,63}
请记住,在域名中假设所有ASCII-English字母不再是非常正确的。例如,http://אתר.קום
是合法(且有效)的网址。