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

时间:2011-12-21 19:12:19

标签: java javascript ruby regex pcre

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

我有一个非常大的项目,涉及JavaScript,Ruby和Java,所有这些都必须触及相同的正则表达式。我们选择Java作为我们的“官方”RE解释器,这意味着每当其他两种语言需要评估RE时,他们必须以某种方式将它传递给Java程序,并且这开始增加了很多开销。 / p>

如果我可以选择任何 RE方言,并至少从所有语言中半原生地调用它,那对我们来说是一个巨大的进步。这可能吗?它已经完成了吗?我们查看了PCRE,并且技术上可以通过Java和Ruby的本机绑定来调用它(虽然它让JS在寒冷中离开),但我还没有发现任何人真正这样做。我们一个人吗?

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

3 个答案:

答案 0 :(得分:11)

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

您可以在以下链接中找到表格中方言之间的差异:


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


由于python和java都有可用于执行本机javascript的模块,你可以说所有表达式都应该为javascript编写,然后让未来的开发人员使用他们可用的模块,以确保regexp总是运行完全正常同样的方式。

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

..或者你可以填写自己的清单/表格。

答案 1 :(得分:1)

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

我认为将你自己限制在你所有三种语言之间常见的大量正则表达式中,并且使用单元测试来确保你的,这可能会更好地将JavaScript用于支持Java特性,反之亦然。正则表达式在所有三个方面表现相同。

答案 2 :(得分:0)

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

希望这有帮助!