3

我有这个正则表达式:

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

我正在测试一个不应该工作的字符串:'#vc'

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

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

但是,如果我删除\"or \-or \`,它确实可以工作(并且测试应该失败)。

我究竟做错了什么 ?

我的正则表达式只是搜索 English 、 numbers 、 space 、 ["]、[-][ 和 [`]

4

1 回答 1

5

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

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

在您的情况下,您可以只使用literalRegExp,其中您只需要关心正则表达式语法中的转义,以及/正则表达式中出现的任何内容的转义(因为/用作 literal 的分隔符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

如您所见,包含从"to`的字符范围,这意味着包含 ASCII 码从 0x22 到 0x60 的所有字符,并且#恰好在该范围内。

要检查模式是否是您想要的,您可以随时调用source正则表达式的属性来获取正则表达式的源字符串。

于 2013-03-19T10:17:52.653 回答