我该如何逃避这个JavaScript正则表达式(RFC 2822电子邮件验证程序)

时间:2012-01-06 05:27:28

标签: javascript regex

我有这个正则表达式:

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

我正在逃避这样的斜线:

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

这似乎工作得很好,但是我担心我错过了一个边缘案例并且这样做会打破正则表达式。这是逃避斜线的正确方法吗?

或者我应该像new那样声明:

var re = new RegExp(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/);

JavaScript在没有斜线转义的情况下正确执行(在Chrome中),但它与编辑器(TextMate)的语法突出显示相混淆。在进一步测试中,即使new也不会消除语法突出显示问题。

1 个答案:

答案 0 :(得分:2)

在JavaScript正则表达式文字中转义正斜杠的正确方法是使用反斜杠:

// unescaped:
some/string
// escaped in regex literal:
/some\/string/

没有我知道的边缘情况,如果你不这样做,你会收到错误。

当你使用new RegExp()时,你应该传递一个字符串,而不是一个正则表达式对象,那就是你应该使用new RegExp("/[a-z0- etc")形式 - 这应该修复语法高亮,但当然要注意字符串文字也有需要转义的字符,包括所有反斜杠。考虑到在正则表达式中使用反斜杠的频率,这意味着字符串形式非常难看,所以它通常只在需要动态构建正则表达式的地方使用。