有没有什么“跨语言”的正则表达式(RegEx)实现?

2021-03-10 10:02:54 +08:00
 AndyAO

正则表达式在各种语言上的实现有很多的区别,所以在使用的过程中常常要注意[1],有的时候需要花挺长时间才能够移植过去。

有没有什么,比较出名的,跨语言的正则表达式实现?

比较,出名的语言应该都支持,例如 Python,Java,C#,JavaScript,Go 等

如果有的话就能够实现一处编写处处运行了。


背景: 在学习的时候,刚开始用的是 PowerShell,发现有很多的表达式在上面运行是有问题的,为了不在这上面浪费时间,最后还是选了和这本书相同的 Python,突然觉得也许会有比较出名的跨平台的实现,如果真是那样的话,那么就好多了,之后用的时候就可以从自己已经写好的表达式中直接复制粘贴,而不用提心吊胆。去谷歌上搜索Cross platform Cross language RegEx,没看到啥有用的信息,所以准备来问问,也许在 V2EX 有人知道。


[1]:《正则指引》

要知道,一种语言下的正则表达式往往并不能直接套用到另一种语言中

...

本书还涵盖了.NET 、Java 、JavaScript 、PHP 、Python 、Ruby 、Objective-C 、Golang 等常用语言,为每种语言专门撰写相关内容,不但详细介绍了语言中正则表达式的用法,更辨析了版本之间的细微差异,既可以作为专门学习的教材,也可以成为有用的参考手册。

1934 次点击
所在节点    程序员
15 条回复
acmore
2021-03-10 10:07:19 +08:00
ANTLR 可以满足,但有些大材小用,写配置也有些繁复。
agagega
2021-03-10 10:09:21 +08:00
很多语言的正则都是 pcre 兼容的
guyeu
2021-03-10 10:13:54 +08:00
你列的这些语言支持的都是 PCRE 标准的正则吧。。
hxndg
2021-03-10 10:15:51 +08:00
应该不能把,反正我记得是各种流派都有的
missdeer
2021-03-10 10:17:13 +08:00
PCRE 吧,很多语言有兼容或绑定
AndyAO
2021-03-10 10:24:39 +08:00
它们并不是兼容的,这个需要特别强调。
mcfog
2021-03-10 10:25:40 +08:00
https://github.com/google/re2

RE2's native language is C++.

The Python wrapper is at https://github.com/google/re2/tree/abseil/python
and on PyPI ( https://pypi.org/project/google-re2/).

A C wrapper is at https://github.com/marcomaggi/cre2/.
An Erlang wrapper is at https://github.com/dukesoferl/re2/ and on Hex (hex.pm).
An Inferno wrapper is at https://github.com/powerman/inferno-re2/.
A Node.js wrapper is at https://github.com/uhop/node-re2/ and on NPM (npmjs.com).
An OCaml wrapper is at https://github.com/janestreet/re2/ and on OPAM (opam.ocaml.org).
A Perl wrapper is at https://github.com/dgl/re-engine-RE2/ and on CPAN (cpan.org).
An R wrapper is at https://github.com/qinwf/re2r/ and on CRAN (cran.r-project.org).
A Ruby wrapper is at https://github.com/mudge/re2/ and on RubyGems (rubygems.org).
A WebAssembly wrapper is at https://github.com/google/re2-wasm/ and on NPM (npmjs.com).

另外 Go 标准库的正则也是参照 re2 的
jtsai
2021-03-10 10:29:54 +08:00
我怎么感觉正则在所有语言里都差不多
AndyAO
2021-03-10 10:30:51 +08:00
刚刚看了上面几位说都是这些语言内置的 RegEx 是兼容的,而这显然不可能,如果是这样的话,那么书就不会花这么多时间来特别的说明,RegexBuddy4 这种专门的工具也不会有各种语言的选项设置。

但`PCRE`这个信息挺好,在查询相关的信息,也许这个关键词可以搜出很多能完全兼容的类库。
AndyAO
2021-03-10 10:31:59 +08:00
感觉差不多是很正常的,因为「多」和「少」这些词都很模糊,这个帖子讨论的就是区别。
AndyAO
2021-03-10 10:35:20 +08:00
搜索 Python PCRE 能找到宣称更好兼容的库,但是下载量少的可怜

python-pcre · PyPI

https://pypi.org/project/python-pcre
AndyAO
2021-03-10 10:39:10 +08:00
从这里来看 Python 中有个模块就叫 RegEx 提供了很多官方 re 中没有的功能。
本来以为会有人统一的去做这样的模块,现在看来也许并不是这样的,还是有的,只是名字和维护者不相同。

How can I use PCRE regexes from a python script?
https://stackoverflow.com/a/23212557
AndyAO
2021-03-10 10:44:02 +08:00
mcfog 提供了很好的信息,原来 Python 的 re 是来自 C++ 的 re2,而且有大量的语言也用了这个实现,看来 re2 就是我想找的东西之一,在 .NET 上也可以用。
AndyAO
2021-03-10 10:47:29 +08:00
啊,感觉好像理解错了 Python 的 Re2 是在这里 ,README 上没说内置的是↓

[google-re2 · PyPI]( https://pypi.org/project/google-re2/)
newmlp
2021-03-10 11:31:12 +08:00
搞个 C\C++语言的库就行了,应该没有语言不支持 C\C++库吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760209

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX