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

2022-09-03 07:32:13

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

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

如果我能选择任何一种RE方言,并至少从所有语言中半本地调用它,那将是我们向前迈出的一大步。这可能吗?它已经完成了吗?我们研究了PCRE,从技术上讲,可以通过Java和Ruby的本机绑定来调用它(尽管它将JS排除在外),但我还没有发现有人真正这样做。我们是孤独的吗?

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


答案 1

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

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


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


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

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

..或者你把一个自己的列表/表格。


答案 2

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

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