我将一些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,但我再次需要它们是动态的。任何帮助表示赞赏。
答案 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对象。