javascript中字符类中的范围无序

javascript中字符类中的范围无序,javascript,regex,validation,Javascript,Regex,Validation,我不知道为什么我的正则表达式不正确: var domain = "google\.com\.br"; var reEmail = new RegExp("^([A-Za-z0-9_\-\.])+\@" + domain + "$"); 我需要这个来验证电子邮件。下面的示例:reEmail.test(“contact@google.com.br"); 我得到这个错误: 范围在字符类中顺序不正确因为您使用字符串创建RegExp,\-\.将变为\.,这是无效的范围。 (它的范围是从\uu到,这是不正

我不知道为什么我的正则表达式不正确:

var domain = "google\.com\.br";
var reEmail = new RegExp("^([A-Za-z0-9_\-\.])+\@" + domain + "$");
我需要这个来验证电子邮件。下面的示例:
reEmail.test(“contact@google.com.br");

我得到这个错误:


范围在字符类中顺序不正确

因为您使用字符串创建RegExp,
\-\.
将变为
\.
,这是无效的范围。 (它的范围是从
\uu
,这是不正确的)

您需要加倍逃逸它:

newregexp(“^([A-Za-z0-9\\-\\.])+@“+域+”$”;
这样,
\
就成为字符串中的一个
\
,然后用于转义RegExp中的
-

编辑:

如果您通过字符串创建RegExp,那么记录结果总是很有帮助的,这样您就可以看到您是否做对了:

e、 g.您在RegExp中的角色

console.log(“^([A-Za-z0-9\-\.])+\@”);
结果:

^([A-Za-z0-9.]+@

使用正则表达式文字:
/^([a-Za-z0-9\-.])+@/
!!!另一方面,处理此问题的快速方法是,如果需要允许
-
作为字符组中的有效字符,请始终将其作为组中的第一个或最后一个字符放置(例如,
[-a-zA-Z0-9 quo;]
[a-zA-Z0-9 quo-]
)。正则表达式足够聪明,可以知道如果字符处于这些位置,您没有指定该字符的范围(无需用斜杠转义)。@talemyn确实如此。就我个人而言,我更喜欢避开它(并且将其设置到我们的编码指南中),因为它有一个特殊的含义。这应该是可以接受的答案。@talemyn的精彩添加also@talemyn这是个很酷的把戏。然而,对于任何一个涉及一个以上开发人员和一天的项目,下一个开发人员(包括明天的您)可能不知道/不记得这个技巧!因此,当他们想在范围中添加一个新字符(比如
)时,他们可能只会将其放在开头(即
[#-a-zA-Z0-9.]
),而整个公司需要三天的时间才能弄清楚为什么它现在被破坏了!