【问题标题】:Is the regular expression syntax in asp.net and javascript identical?asp.net 和 javascript 中的正则表达式语法是否相同?
【发布时间】:2012-09-20 05:01:56
【问题描述】:

我的问题如标题所示。如果两种语法不同,那么如何将 asp.net 中的正则表达式转换为 javascript。

非常感谢任何人的回答。

编辑:我有正则表达式来测试电子邮件地址,如下所示:

"((([a-z]|\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)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))"

它在 .net 中运行良好。但是当我模拟正则表达式并在 javascript 中使用时:

new RegeExp(regex).test(email);

它抛出一个语法错误:

SyntaxError: Invalid regular expression

那么我该如何在 javascript 中使用那个可怕的正则表达式呢?

【问题讨论】:

  • 如果您使用字符串在 JavaScript 中构造正则表达式,例如,您需要将反斜杠加倍。还有一些其他的语法变化。请参阅我为转换的正则表达式编辑的答案。

标签: c# javascript asp.net regex


【解决方案1】:

它们是不同的。要测试它如何在 JavaScript 中运行,您可以执行以下操作:

Regex.IsMatch("input", "regex", RegexOptions.ECMAScript)

在 .NET 中,这将使其非常等效。如果可以,请通过它运行一些代码。这将帮助您确定它们是否工作相同。

为了编写和测试 JavaScript 的 RegEx 实现,我强烈推荐 http://regexpal.com/ 它 100% 在浏览器中运行,甚至为您实时突出显示。

【讨论】:

    【解决方案2】:

    除了语法差异之外,还有很多 .NET 拥有而 JavaScript 没有的东西:

    • 回顾断言
    • 支持 Unicode 属性(这也会影响速记字符类,如 \w,字边界如 \b 等)
    • 递归正则表达式
    • 前向引用
    • 原子分组
    • 条件
    • POSIX 字符类
    • 命名的捕获组
    • 一个 DOTALL 选项
    • 多行正则表达式
    • 许多其他小细节as seen here

    因此,如果您的 .NET 正则表达式使用这些功能中的任何一个,则需要对它们进行大量修改,或者(在后向和递归的情况下)无法转换为 JavaScript。

    编辑:

    就您的正则表达式而言,似乎主要需要更改语法(我使用RegexBuddy 完成的一项任务)。生成的正则表达式是这样的:

    var myregexp = /((([a-z]|\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)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))/;
    

    我不知道这个怪物应该做什么,所以你需要测试它是否符合你的期望。

    【讨论】:

    • 非常感谢您的发现:)。它按我的预期工作。正则表达式看起来很冗长,但目前我需要使用它。现在我知道了一个使用正则表达式的强大工具。再次感谢。
    【解决方案3】:

    Javascript 使用 XRegExp,.NET 使用 Microsoft。它们是不同的。

    XRegExp 似乎功能较少。

    维基百科有对比图http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines

    【讨论】:

    • 没有。 XRegExp 是 Steve Levithan 对 JavaScript 的原生正则表达式引擎的第三方扩展。它不是 JavaScript 的一部分。
    【解决方案4】:

    正则表达式几乎相同,但在不同的编程语言中使用的语法可能不同。

    RegExBuddy 是编写 RegEx 并在大多数流行编程语言中得到使用的好工具。

    【讨论】:

    • 我认为 JavaScript 的原生正则表达式大大不如 .NET 的正则表达式。他们不在同一个球场,嗯,甚至不在同一个联盟。
    • 我不想和哥们争论。我的意思是“几乎一样”
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多