首页 文章

我怎样才能将Javascript语法中的正则表达式转换为.NET语法

提问于
浏览
0

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

return this.optional(element)||
/ ^((([az] | \ d | [!#\ $%&'* - / = \?\ ^ _ {\ |}〜] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF])(\ . ([az] | \ d | [!#\ $%&'\ * \ \ - \ / = \?\ ^ _ {\ |}〜] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF])))|((\ x22)((((\ x20 | \ x09)(\ x0d \ x0a))?(\ x20 | \ x09))?(([\ x01- \ X08 \ X0B \ X0C \ x0e- \ X1F \ 0x7F部分] | \ X21 | [\ x23- \ x5b] | [\ x5d- \ x7e] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF])|(\([\ x01- \ X09 \ X0B \ X0C \ x0d- \ 0x7F部分] | [\ 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(值) . ?;

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

谢谢 .

2 回答

  • 3

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

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

    凭借我对Regex的低迷知识,这个程序是一个救星 .

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

    **额外注意 - 我只是注意到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
    
  • 1

    我不知道它是否只是一个你感兴趣的电子邮件验证,或者它是否是任意模式,但根据我在该示例片段和大多数其他JS正则表达式中可以看到的内容,它们与正则表达式规范的差别可能不大 . .NET,意味着可能由于某些其他语法差异/错误而出现错误 .

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

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

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

相关问题