【问题标题】:How could I translate regular expressions in Javascript syntax to .NET syntax如何将 Javascript 语法中的正则表达式转换为 .NET 语法
【发布时间】:2011-10-10 21:35:50
【问题描述】:

我正在查看jquery.validate plugin source code,以检查正在使用哪些表达式来检查字段的有效性,因此我可以在服务器端实现相同的功能。我进入了电子邮件的正则表达式,例如:

return this.optional(element) ||

/^((([az]|\d|[!#\$%&'*+-/=\?\^_{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_{\|}~]|[\u00A0- \uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+))|((\x22)((((\x20|\x09)(\x0d\x0a))?(\ x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\ u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0 -\uFFEF]))))(((\x20|\x09)(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@( (([az]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0 -\uFFEF])([az]|\d|-|.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([az]|\d|[\ u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))).)+(([az]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az ]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([az]|\d|-|.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0- \uFFEF])*([az]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))).?$/i.test(value);

我猜,粗体部分是表达式,但它在 .NET 中不起作用(它一直说电子邮件错误)我猜这是因为 javascript 编码的字符。有没有一种简单的方法可以用来翻译表达式?

谢谢。

【问题讨论】:

  • 是否需要使用正则表达式进行电子邮件验证?一种选择是尝试创建邮件地址:try { new MailAddress(input); return true; } catch(FormatException) { return false; }
  • 是的,这是一个要求。所以我们可以在客户端和服务器中使用相同的验证。

标签: javascript asp.net-mvc regex asp.net-mvc-3


【解决方案1】:

虽然它是商业的(即非免费但便宜),但我不能高度推荐“RegexBuddy”http://www.regexbuddy.com/

使用标准的“标准”RegEx 语法(您可以交互式地构建和测试),它会生成正确语法的源代码,用于多种环境和许多“场景”,包括 .net、javascript、Perl、PHP、 Python等

由于我对正则表达式的了解不足,这个程序是救命稻草。

* 免责声明:没有任何隶属关系 - 只是一个非常高兴的多年客户

** 额外说明 -- 我只是注意到 Jeff Attwood 在他们的主页上有一个推荐!

  • 只是为了好玩:这是 RegExBuddy 为 .net (C#) 和 JavaScript 生成的 RFC2822 电子邮件验证源

JavaScript:

if (/(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/im.test(subject)) {
    // Successful match
} else {
    // Match attempt failed
}

.net C#

try {
    if (Regex.IsMatch(subjectString, @"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])", RegexOptions.IgnoreCase | RegexOptions.Multiline)) {
        // Successful match
    } else {
        // Match attempt failed
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression

【讨论】:

  • 谢谢!我会得到那个应用程序,我也不记得所有那些符号的喷射
【解决方案2】:

我不知道这只是您有兴趣验证的电子邮件还是任意模式,但根据我在该示例 sn-p 和大多数其他 JS 正则表达式中看到的内容,它们可能没有太大区别使用 .NET 的正则表达式规范,这意味着错误可能是由于其他一些语法差异/错误而出现的。

JavaScript 的正则表达式风格是该语言 (see) 的 ECMA-262 标准的一部分,尽管两者(Javascript 和 .NET 正则表达式)都源自 Perl 的正则表达式规范 (see)。因此,这可能会为您提供有关两者相似之处和不同之处的线索。

但就像我说的,如果只是你感兴趣的电子邮件模式,试试这个:

(\w+@[a-zA-Z_]+?.[a-zA-Z]{2,6})

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2021-07-10
    • 2016-05-02
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多