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

Mar*_*rin 4 javascript regex

我写了以下正则表达式:

(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?
Run Code Online (Sandbox Code Playgroud)

它的行为可以在这里看到:http://gskinner.com/RegExr/?34b8m

我写了以下JavaScript代码:

var urlexp = new RegExp(
    '^(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?$', 'gi'
);
document.write(urlexp.test("blaaa"))
Run Code Online (Sandbox Code Playgroud)

true即使正则表达式不允许单个单词有效,它也会返回.

我究竟做错了什么?

Fra*_*Man 7

您的问题是JavaScript正在查看所有转义序列作为字符串的转义.所以你的正则表达式记忆如下:

^(https?://)?([da-z.-]+).([a-z]{2,6})(/(w|-)*)*/?$
Run Code Online (Sandbox Code Playgroud)

当您认为文字句点变为正则表达式通配符时,您可能会注意到中间会出现问题.您可以通过几种方式解决此问题.使用正斜杠正则表达式语法JavaScript提供:

var urlexp = /^(https?:\/\/)?([da-z\.-]+)\.([a-z]{2,6})(\/(\w|-)*)*\/?$/gi
Run Code Online (Sandbox Code Playgroud)

或者通过逃避你的反斜杠(而不是正如你所做的那样向前倾斜 - 这只是当你使用/regex/mod符号时,就像你不必在双引号字符串中转义单引号,反之亦然):

var urlexp = new RegExp('^(https?://)?([da-z.-]+)\\.([a-z]{2,6})(/(\\w|-)*)*/?$', 'gi')
Run Code Online (Sandbox Code Playgroud)

请注意w之前的双反斜杠 - 也是匹配单词字符所必需的.

关于你的正则表达式的一些注释:

[da-z.-]
Run Code Online (Sandbox Code Playgroud)

d包含在az范围内.除非你的意思\d?在这种情况下,斜线很重要.

(/(\w|-)*)*/?
Run Code Online (Sandbox Code Playgroud)

我自己对嵌套的Kleene星的疑虑放在一边,你可以把这个交替减少到一个字符类,然后/?完全放弃终止,因为一个尾随的斜线将与你给它的组相匹配.我改写为:

(/[\w-]*)*
Run Code Online (Sandbox Code Playgroud)

虽然,也许你只想捕捉非太空人物?

(/[^/\s]*)*
Run Code Online (Sandbox Code Playgroud)

无论如何,通过这种方式修改你的正则表达式看起来更像是:

^(https?://)?([\da-z.-]+)\.([a-z]{2,6})(/[\w-]*)*$
Run Code Online (Sandbox Code Playgroud)

请记住,如果你要使用字符串表示法:双重反斜杠.如果您要使用本机/regex/mod符号(我强烈推荐),请跳过正斜杠.

  • @asad不是真的.问题是反斜杠没有存活到内存字符串表示中,因此意义正在改变.这是反斜杠和字符串表示的整个问题.所以`new RegExp(RegExp.quote('[a\-z]'))`会(用你的新正则表达式)生成正则表达式`/ [az] /`,因为函数看到的字符串看起来像` [az]`,根本不包含反斜杠.`new RegExp(RegExp.quote('[a \\ - z]'))``会发送一个看起来像`[a\-z]`的字符串,但生成正则表达式`/ [a \\ - z] /`,这是危险的错误. (2认同)