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

How can I use the same regular expression in different programming languages?

本文关键字:正则表达式 编程语言      更新时间:2023-09-26

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

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

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

我没有提到的一个问题是,这个系统应用用户提供的正则表达式。(是的,我理解这是一个安全问题等,但它是供受信任的、有属性的用户在内部使用的。)我当然可以建议列出一个"不要这样做"的功能列表来避免,但我希望这不是最好的解决方案。

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

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

  • Regular -expressions.info:比较正则表达式风格

它们之间的主要区别在于正则表达式更"高级"的特性。如果你不使用这些,你将处于安全地带。


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

虽然我只是记录你的应用程序说,无论使用什么正则表达式都需要被所有三种语言支持,然后将它们指向一个表(比如前面链接的那个),说他们应该查找可用的。

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

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

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

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

希望这对你有帮助!