我写了以下正则表达式:
(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?
其行为可以在这里看到:http://gskinner.com/RegExr/?34b8m
我编写了以下JavaScript代码:
var urlexp = new RegExp(
'^(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?$', 'gi'
);
document.write(urlexp.test("blaaa"))
即使正则表达式不允许单个单词有效,它也会返回true
。
我做错了什么?
答案 0 :(得分:6)
您的问题是JavaScript正在查看所有转义序列作为字符串的转义符。所以你的正则表达式看起来像这样:
^(https?://)?([da-z.-]+).([a-z]{2,6})(/(w|-)*)*/?$
当您认为文字句点变为正则表达式通配符时,您可能会注意到中间会出现问题。您可以通过几种方式解决此问题。使用正斜杠正则表达式语法JavaScript提供:
var urlexp = /^(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?$/gi
或者通过逃避你的反斜杠(而不是正如你所做的那样正斜线) - 这是专门用于使用/regex/mod
符号的时候,就像你不必逃避你的单引号一样双引号字符串,反之亦然):
var urlexp = new RegExp('^(https?://)?([da-z.-]+)\\.([a-z]{2,6})(/(\\w|-)*)*/?$', 'gi')
请注意w之前的双反斜杠 - 也是匹配单词字符所必需的。
关于你的正则表达式的几个注释:
[da-z.-]
d
包含在a-z范围内。除非你的意思是\d
?在这种情况下,斜线很重要。
(/(\w|-)*)*/?
我自己对嵌套的Kleene星的疑虑放在一边,你可以把这个交替减少到一个字符类,然后完全放弃终止/?
,因为你给出的尾随斜线将被小组匹配它。我改写为:
(/[\w-]*)*
虽然,也许你只想捕捉非太空人物?
(/[^/\s]*)*
无论如何,通过这种方式修改你的正则表达式看起来更像是:
^(https?://)?([\da-z.-]+)\.([a-z]{2,6})(/[\w-]*)*$
请记住,如果你要使用字符串表示法:双重反斜杠。如果您要使用原生/regex/mod
符号(我强烈推荐),请转义正斜杠。