JSHint“糟糕或不必要的逃脱”。双斜线开始/结束有关系吗?

时间:2014-04-22 21:20:48

标签: javascript regex

我将一些RegExps作为字符串存储在Object中,但是收到上述错误消息。

我相信这是因为它们没有前缀/或后缀为/ - 因为我将它们运行到一个新的RegExp()构造函数中,因为脚本允许用户定义RegExps,所以我希望它们都是动态的。

var patterns = {
    email: '^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$',
    url: '[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)',
    number: '^[-+]?[0-9]*\.?[0-9]+$',
    empty: '^\\s*$'
};

有以上字符串。

要修复它们,我可以这样做和/ /它们:

var patterns = {
    email: '/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/',
    url: '/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/',
    number: '/^[-+]?[0-9]*\.?[0-9]+$',
    empty: '/^\\s*$/'
};

但是当通过new RegExp()调用时,他们肯定会这样做(例如):

var reg = new RegExp(patterns.empty);
/**
 * reg = //^\\s*$//
 */

带双斜线。我的问题作为一个RegExp初学者,是做这些双斜线很重要吗?它可以用另一种方式修复。 JSHint抱怨,因为它不是一个“真正的”RegExp。

我也可以从字符串中删除它们并存储为真正的RegExps,但我再次需要它们是动态的。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:7)

问题是反斜杠字符(\)用于转义字符串文字中的特殊字符(例如\n被解释为单个换行符,而\\被解释为单反斜杠字符),它用于在正则表达式中转义特殊字符。

因此,当字符串文字用于正则表达式,并且您需要正则表达式来查看\时,您需要转义反斜杠并在字符串文字中包含\\。具体而言,在email中,您需要\\.而不是\.。 E.g。

email: '^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$'

或者,您可以将正则表达式放在/.../而不是'...'(或'/.../')中。然后字符串文字转义不适用,并且您不需要加倍斜杠。 E.g。

email: /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

在后一种情况下,您也不需要new RegExp(patterns.email),因为patterns.email已经是RegExp对象。