如何在不同的编程语言中使用相同的正则表达式?

Posted

技术标签:

【中文标题】如何在不同的编程语言中使用相同的正则表达式?【英文标题】:How can I use the same regular expression in different programming languages? 【发布时间】:2012-01-25 13:44:57 【问题描述】:

我见过this question,我从经验中知道每种语言似乎都支持不同的正则表达式方言。我想这个问题已经存在很长时间了,所以有人一定想对此做点什么。

我有一个涉及 javascript、Ruby 和 Java 的大型项目,所有这些项目都必须涉及相同的正则表达式。我们选择 Java 作为我们的“官方”RE 解释器,这意味着任何时候其他两种语言需要评估一个 RE,他们都必须以某种方式将其传递给 Java 程序,这开始增加很多开销。

如果我可以选择任何 RE 方言并从所有语言中至少半原生地调用它,这对我们来说将是一个巨大的进步。这可能吗?已经在做了吗?我们研究了 PCRE,技术上可以通过 Java 和 Ruby 的本机绑定调用它(尽管它使 JS 处于冷漠状态),但我还没有发现有人真正这样做。我们是一个人吗?

ETA:我没有提到的一个问题是这个系统应用了用户提供的正则表达式。 (是的,我知道这是一个security issue 等,但它是供受信任的、有归属感的用户在内部使用的。)我当然可以建议列出一个“不要这样做”的电源功能列表来避免,但我有点希望这不是最好的解决方案。

【问题讨论】:

啊,用户提供的正则表达式。我知道我们错过了什么;) (我只是想发布我们最终使用的权宜之计,以防有人关心。不过,我仍然希望听到更好的消息。)我们选择了 Java 正则表达式。如果 Ruby 在 JRuby 中运行,我们可以从 Ruby 代码本地运行这些。就我们的目的而言,这已经足够了。我们还编写了一个 Java servlet,它基本上针对测试数据运行正则表达式,作为 RESTful 服务。这会处理 JavaScript 端,虽然它当然不漂亮:-/ 【参考方案1】:

您在帖子中隐含提到的方言并没有太大的不同,有些东西是由一种方言支持而不是其他方言,但这通常不会导致任何问题,除非您正在编写真正专门针对某一方言的正则表达式有问题的方言。

您可以在以下链接中查看表中方言之间的差异:

regular-expressions.info: Compare Regular Expression Flavors

它们之间的主要区别在于正则表达式的更“高级”功能。如果您不使用这些,您将处于安全区域。


由于 python 和 java 都有可用于执行本机 javascript 的模块,您可以说所有表达式都应该为 javascript 编写,然后让未来的开发人员使用他们可用的模块,以确保运行的 regexp 始终能够准确运行同样的方式。

虽然我只是记录了您的应用程序,说使用的任何正则表达式都需要得到所有三种语言的支持,然后将它们定向到一个表(例如之前链接的那个),说他们应该查找可用的内容使用。

..或者你可以自己编译一个列表/表格。

【讨论】:

超级棒的链接,但我注意到实际上有一些 not 高级功能可能很重要。我首先想到的是Hyphen in [\d-z] is a literal——这不是一种不常见的语法,而且我认为你不能编写一个字符类,当你谈论连字符时,它在 Java 和 Ruby 下都可以正常工作。 不明白为什么有理智的人会写这样的声明?如果您想在 `[] 中使用连字符作为字符而不是范围运算符,请将其放在最后,这是更标准的。关于它在远程中的使用,从维护的角度来看,冗长通常更好,例如,我不建议人们使用 [a-\d]。【参考方案2】:

方言都略有不同,但它们几乎在所有主要点上都有重叠。 (主要区别不在于正则表达式本身,而在于您如何称呼它们(一种语言的find 是另一种语言的matches,依此类推)以及对正则表达式文字的支持(一种语言的// 是另一种语言的原始字符串是另一个反斜杠字符串)。)

与其以某种方式让 JavaScript 支持 Java 特性,反之亦然,我认为最好将自己限制在所有三种语言之间通用的大量正则表达式中,并使用单元测试来确保你的正则表达式在所有三个中的行为都相同。

【讨论】:

【参考方案3】:

一个(重量级)选项是构建一个“正则表达式交叉编译器”,它可以接受以某种规范形式(例如,作为 Perl 正则表达式)编写的正则表达式作为输入,然后将其扫描并解析为语法树并输出其他语言(例如 Python 或 Java)的等效正则表达式。这将让您编写一次正则表达式并让它在任何地方都可以使用,因为编译器将完成所有格式之间的转换工作。

希望这会有所帮助!

【讨论】:

我要这个吗?一定不行。没门。但是,如果您在某处发现此问题,请随时更新您的答案,我会接受! :D

以上是关于如何在不同的编程语言中使用相同的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式但以另一种格式替换文件的相同名称?

相同的正则表达式在 Java 和 JavaScript 中具有不同的结果 [重复]

C语言怎么用正则表达式

Python爬虫解析神器-正则表达式如何正确运用?案例详解

Python爬虫解析神器-正则表达式如何正确运用?案例详解

正则表达式原理