4

我的问题如标题所示。如果两种语法不同,那么如何将 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中使用那个可怕的正则表达式呢?

4

4 回答 4

2

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

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

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

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

于 2012-09-20T05:22:44.277 回答
1

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

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

因此,如果您的 .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])))/;

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

于 2012-09-20T06:20:38.060 回答
1

Javascript 使用 XRegExp,.NET 使用 Microsoft。它们不一样。

XRegExp 似乎具有较少的功能。

维基百科有一个比较图表http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines

于 2012-09-20T05:21:34.603 回答
0

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

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

于 2012-09-20T05:14:31.460 回答