我有这个正则表达式:
new RegExp("^[a-z 0-9\"\-\`]+$", "ig")
我正在测试一个不起作用的字符串:'#vc'
但它确实通过了测试:(它不应该(#
))
new RegExp("^[a-z 0-9\"\-\`]+$", "ig").test('#vc') //true
但是,如果我删除了\"
或\-
或\`
,它确实有效(并且测试失败了。)
我做错了什么?
我的正则表达式只搜索英文,数字,空格,[“],[ - ] [和[`]
答案 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碰巧在范围内。
要检查模式是否符合您的要求,您始终可以调用正则表达式的#
属性来获取正则表达式的源字符串。