2013-07-18 29 views
22

我不知道,因为我的正则表达式是不正确的:范围无序的字符类在javascript

var domain = "google\.com\.br"; 
var reEmail = new RegExp("^([A-Za-z0-9_\-\.])+\@" + domain + "$"); 

我需要这个来验证电子邮件,例如:reEmail.test("[email protected]");

我得到这个错误:

范围不按顺序在字符类

+0

使用正则表达式字面:'/ ^([A-ZA-Z0-9 _ \ - ])+ @ /'! – Bergi

回答

43

因为你使用字符串创建正则表达式的_\-\.变为_-.,那是无效范围。 (距离_.一个范围,这是不正确的)

您需要双逃生它:

new RegExp("^([A-Za-z0-9_\\-\\.])[email protected]" + domain + "$"); 

这样的\\成为String中\,然后用以逃避RegExp中的-

编辑:

例如:

如果通过字符串创建的RegExp它始终是有用的,这样你看,如果你做的一切权利记录结果你对正则表达式的一部分

console.log("^([A-Za-z0-9_\-\.])+\@"); 

结果:

^([A-Za-z0-9_-.])[email protected] 
+6

在附注中,处理这种情况的一种快速方法是,如果您需要在您的字符组中使用'-'作为有效字符,则始终将其作为组中的第一个或最后一个字符(例如'[[ -a-zA-Z0-9 _]'或'[a-zA-Z0-9 _-]')。正则表达式足够聪明,知道你没有指定一个具有该角色的范围,如果它位于那些位置(不需要用斜线逃脱)。 – talemyn

+0

@talemyn当然,这是真的。我个人更喜欢逃避它(也将其设置为我们的编码准则),因为它具有特殊的含义。 –

+0

这应该是接受的答案。 @talemyn也很好的补充 – adi