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

Hal*_*991 5 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*$'
};
Run Code Online (Sandbox Code Playgroud)

有上面的字符串.

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

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*$/'
};
Run Code Online (Sandbox Code Playgroud)

但是,当new RegExp()他们确实调用时,他们会这样做(例如):

var reg = new RegExp(patterns.empty);
/**
 * reg = //^\\s*$//
 */
Run Code Online (Sandbox Code Playgroud)

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

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

DS.*_*DS. 7

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

因此,当字符串文字用于正则表达式,并且您需要使用正则表达式时\,您需要转义反斜杠并包含\\在字符串文字中.具体来说,在email你需要\\.而不是\..例如

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

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

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

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