正则表达式没有按预期工作?

时间:2013-03-19 10:14:03

标签: javascript regex

我有这个正则表达式:

new RegExp("^[a-z 0-9\"\-\`]+$", "ig")

我正在测试一个不起作用的字符串:'#vc'

但它确实通过了测试:(它不应该(#))

new RegExp("^[a-z 0-9\"\-\`]+$", "ig").test('#vc') //true

但是,如果我删除了\"\-\`,它确实有效(并且测试失败了。)

我做错了什么?

我的正则表达式只搜索英文,数字,空格,[“],[ - ] [和[`]

1 个答案:

答案 0 :(得分:5)

如果你使用RegExp构造函数,你需要加倍转义,因为有2层转义:在JavaScript字符串文字中转义并在正则表达式语法中转义。

但是,在您的情况下,可以编写正则表达式而不必转义。

在您的情况下,您可以使用文字RegExp ,其中您只需要关注正则表达式语法中的转义,并转义出现的任何/正则表达式(因为/用作文字RegExp的分隔符:

/^[a-z 0-9"\-`]+$/gi

另一种方式是:

/^[a-z 0-9"`-]+$/gi

如果它是字符类中的最后一个,则无需转义短划线-。这样,您就不需要将自己与所有逃避混淆。

或者如果您仍想使用RegExp构造函数,则需要将转义加倍以在字符串中指定\

new RegExp('^[a-z 0-9"\\-`]+$', "ig")

或者只使用字符类中最后指定-的其他版本:

new RegExp('^[a-z 0-9"`-]+$', "ig")

请注意,我将字符串引用从"更改为',以避免在字符串中转义"。如果由于某种原因您更喜欢",请在文字字符串级别转义"

new RegExp("^[a-z 0-9\"`-]+$", "ig")

关于你目前的正则表达式

new RegExp("^[a-z 0-9\"\-\`]+$", "ig")

相当于

/^[a-z 0-9"-`]+$/gi

您可以看到包含"`的字符范围,这意味着包含ASCII代码从0x22到0x60的所有字符,以及{{1碰巧在范围内。

要检查模式是否符合您的要求,您始终可以调用正则表达式的#属性来获取正则表达式的源字符串。