我将一些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,但我再次需要它们是动态的.任何帮助赞赏.
问题是反斜杠字符(\
)用于转义字符串文字中的特殊字符(例如,\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对象.