【问题标题】:Range out of order in character class in javascriptjavascript中字符类的范围乱序
【发布时间】:2013-07-17 15:56:56
【问题描述】:

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

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

我需要这个来验证电子邮件。下面的例子:reEmail.test("contact@google.com.br");

我收到此错误:

字符类中的范围乱序

【问题讨论】:

  • 使用正则表达式:/^([A-Za-z0-9_\-.])+@/!!!

标签: javascript regex validation


【解决方案1】:

因为您使用字符串创建正则表达式,所以_\-\. 变为_-.,这是无效范围。 (这是从_. 的范围,这是不正确的)

你需要双重转义它:

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

这样\\ 变成字符串中的\,然后用于转义正则表达式中的-

编辑:

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

例如你在 RegExp 中的一部分

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

结果:

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

【讨论】:

  • 附带说明,处理此问题的一种快速方法是,如果您需要允许 - 作为字符组中的有效字符,请始终将其作为第一个或最后一个字符组(例如,[-a-zA-Z0-9 _][a-zA-Z0-9 _-])。正则表达式足够聪明,可以知道您没有使用该字符指定范围,如果它在那些位置(不需要用斜杠转义它)。
  • @talemyn 确实如此。我个人更喜欢转义它(并将其设置到我们的编码指南中),因为它具有特殊含义。
  • 这应该是被接受的答案。 @talemyn 的补充也不错
  • @talemyn 这是一个非常酷的技巧。但是,对于任何一天涉及多个开发人员的项目,下一个开发人员(包括明天的您自己)可能不知道/记住这个技巧!所以,当他们想在范围内添加一个新字符(比如#)时,他们可能只是把它放在开头(即[#-a-zA-Z0-9_]),整个公司需要三天时间才能弄清楚为什么它现在坏了!
  • @Aidin - 在那里不得不不同意你的观点。这不是一个技巧,它只是 regex 的 JavaScript 风格中破折号的潜在行为之一。 . .当你像这样使用斜线时,实际上与理解斜线的行为没有什么不同:“\”与这个:“\\”。现在我并不是说它是一种更广为人知的行为,但仅仅因为很多人不了解某个功能并不意味着您不应该使用它。 . .这就是更多人最终了解它的方式。
猜你喜欢
  • 2015-05-15
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多