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

Java 如何在不同的编程语言中使用相同的正则表达式?,java,javascript,ruby,regex,pcre,Java,Javascript,Ruby,Regex,Pcre,我看到过,而且我从经验中知道,每种语言似乎都支持不同的regex方言。我想这个问题已经存在很长时间了,所以一定有人想做点什么 我有一个相当大的项目,涉及JavaScript、Ruby和Java,它们都必须使用相同的正则表达式。我们选择Java作为我们的“官方”RE解释器,这意味着任何时候其他两种语言需要评估RE时,它们都必须以某种方式将其传递给Java程序,这就开始增加很多开销 如果我能从所有的语言中选择任何一种方言并至少半本地地调用它,这对我们来说将是一个巨大的进步。这可能吗?已经完成了吗?我

我看到过,而且我从经验中知道,每种语言似乎都支持不同的regex方言。我想这个问题已经存在很长时间了,所以一定有人想做点什么

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

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


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

您在帖子中暗示的方言没有太大的不同,有些东西是由一种语言支持的,而不是由另一种语言支持的,但是这通常不会引起任何问题,除非您编写的正则表达式实际上是专门针对所讨论的方言之一的

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


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


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

尽管我只是记录了您的应用程序,说明无论使用何种正则表达式,都需要所有三种语言的支持,然后将它们指向一个表(如之前链接的表),说明它们应该查找可用的内容


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

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

我认为与其让JavaScript支持Java特性,或者让JavaScript支持Java特性,不如将自己限制在三种语言之间通用的正则表达式的巨大子集上,并使用单元测试来确保正则表达式在这三种语言中的行为相同。

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


希望这有帮助

超级棒的链接,但我注意到实际上有一些不先进的功能,可能会有影响。我首先想到的是[\d-z]中的
连字符是一种文字
——这是一种很常见的语法,我认为当你谈论连字符时,你不能编写一个字符类,它在Java和Ruby下都可以相同地工作。但我不明白为什么任何理智的人都会编写这样的语句?如果希望在“
[]
中使用连字符作为字符而不是范围运算符,请将其放在末尾,这更标准。关于它在range中的使用,从维护的角度来说,冗长通常更好,我不建议人们使用[a-\d],例如。啊,用户提供的正则表达式。我知道我们错过了什么;)(我只是想发布我们最终使用的权宜之计,以防有人在意。不过,我还是希望听到更好的消息。)我们选择了Java正则表达式。如果Ruby在JRuby中运行,我们可以从Ruby代码本机运行这些代码。就我们而言,这已经足够了。我们还编写了一个Javaservlet,它基本上是针对测试数据运行一个正则表达式,作为一个RESTful服务。这会处理JavaScript端,当然它并不漂亮:-/我想写这个吗?不,不可能。但是,如果你发现这个问题在某个地方出现,请随时更新你的答案,我会接受的!:D