正则表达式在JavaScript中没有按预期工作

时间:2013-03-30 08:47:30

标签: javascript regex

我写了以下正则表达式:

(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

我做错了什么?

1 个答案:

答案 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符号(我强烈推荐),请转义正斜杠。