【问题标题】:C# regex doesn't work in JavascriptC# 正则表达式在 Javascript 中不起作用
【发布时间】:2014-01-16 07:42:02
【问题描述】:

我正在使用以下正则表达式来验证电子邮件:

^[a-zA-Z0-9!$'*+/\-_#%?^`&=~}{|]+(\.[a-zA-Z0-9!$'*+/\-_#%?^`&=~}{|]+)*@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-['&_\]]]+)(\.[\w-['&_\]]]+)*))(\]?)$

这在 C# 中工作正常,但在 JavaScript 中,它不起作用....是的,我用双反斜杠替换了每个反斜杠,如下所示:

^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-['&_\\]]]+)(\\.[\\w-['&_\\]]]+)*))(\\]?)$

我正在使用 XRegExp。我在这里错过了什么吗?有没有转换器可以将普通的正则表达式转换为 JavaScript :) ?

这是我的功能:

 function CheckEmailAddress(email) {
     var reg = new XRegExp("^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-['&_\\]]]+)(\\.[\\w-['&_\\]]]+)*))(\\]?)$")

     if (reg.test(email) == false) {
         return false;
     }

     return true;
 }

对于简单的“abc@123.com”电子邮件地址返回 false。

提前致谢!

凯文

【问题讨论】:

  • 转义反斜杠意味着您匹配的是文字 `​​`... JS 正则表达式与 PCRE 的正则表达式非常相似,但稍微更容易。您不应该使用正则表达式验证电子邮件地址。这是不可能的……没有人能够使用单个正则表达式验证所有个有效的电子邮件地址……哦,你为什么使用 XRegExp,而不是简单的正则表达式?跨度>
  • 您认为我还能如何在客户端验证电子邮件格式?
  • 你没有。您可以进行一些基本验证(例如:输入是否包含@ 符号),但数据验证在服务器端完成
  • 不,我买不起无效的电子邮件格式……所以……回到我的问题。我的正则表达式有什么问题?
  • 为什么不呢?你不是在执行 any 服务器端验证吗?因为 that 是你买不起的……不验证用户输入服务器端

标签: javascript regex backslash xregexp


【解决方案1】:

问题是您的正则表达式包含character class subtractions。 JavaScript 的 RegExp 不支持它们,XRegExp 也不支持。 (我一开始记错了,并评论说确实如此,但事实并非如此。)

但是,字符类减法可以替换为负前瞻,因此:

[\w-['&_\\]]]

可以变成这样:

(?:(?!['&_\\]])\\w)

两者都表示“任何单词字符,但不是集合'&_]中的一个”。表达式\w 与'、& 或] 不匹配,因此我们可以简化为:

(?:(?!_)\\w)

或者由于\w是[A-Za-z0-9_],我们可以从列表中删除下划线并进一步简化为:

[A-Za-z0-9]

所以最终的正则表达式是这样的:

new RegExp("^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([A-Za-z0-9]+)(\\.[A-Za-z0-9]+)*))(\\]?)$")

我已经对此 RegExp 进行了适度的测试,但您应该尽职尽责地检查它。

执行负前瞻步骤来简化正则表达式并不是绝对必要的,但知道字符类减法可以用负前瞻代替,这在手动简化困难或脆弱的更一般情况下很有用。

【讨论】:

  • 哇,真是个好答案。你研究正则表达式有多久了?
  • 我已经使用正则表达式多年了。
  • 我也用了很长时间的正则表达式,但我自己从来没有使用过这个功能。我听说过,但我没有在这个问题中看到这个很少的结构。 +1。
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多