V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AndyAO
V2EX  ›  程序员

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

  •  4
     
  •   AndyAO · 2021-03-10 10:02:54 +08:00 · 2047 次点击
    这是一个创建于 1365 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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


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


    [1]:《正则指引》

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

    ...

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

    第 2 条附言  ·  2021-03-12 12:44:27 +08:00

    Python 文档上[^1]有这样的说明,对于处理 Unicode 内容,官方更推荐用第三方模块。

    [^1]:See also The third-party regex module, which has an API compatible with the standard library re module, but offers additional functionality and a more thorough Unicode support.另请参阅第三方regex模块,该模块具有与标准库re模块兼容的API,但提供了附加功能和更全面的Unicode支持。

    15 条回复    2021-03-10 11:31:12 +08:00
    acmore
        1
    acmore  
       2021-03-10 10:07:19 +08:00
    ANTLR 可以满足,但有些大材小用,写配置也有些繁复。
    agagega
        2
    agagega  
       2021-03-10 10:09:21 +08:00 via iPhone
    很多语言的正则都是 pcre 兼容的
    guyeu
        3
    guyeu  
       2021-03-10 10:13:54 +08:00
    你列的这些语言支持的都是 PCRE 标准的正则吧。。
    hxndg
        4
    hxndg  
       2021-03-10 10:15:51 +08:00
    应该不能把,反正我记得是各种流派都有的
    missdeer
        5
    missdeer  
       2021-03-10 10:17:13 +08:00
    PCRE 吧,很多语言有兼容或绑定
    AndyAO
        6
    AndyAO  
    OP
       2021-03-10 10:24:39 +08:00
    它们并不是兼容的,这个需要特别强调。
    mcfog
        7
    mcfog  
       2021-03-10 10:25:40 +08:00   ❤️ 1
    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
        8
    jtsai  
       2021-03-10 10:29:54 +08:00
    我怎么感觉正则在所有语言里都差不多
    AndyAO
        9
    AndyAO  
    OP
       2021-03-10 10:30:51 +08:00
    刚刚看了上面几位说都是这些语言内置的 RegEx 是兼容的,而这显然不可能,如果是这样的话,那么书就不会花这么多时间来特别的说明,RegexBuddy4 这种专门的工具也不会有各种语言的选项设置。

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

    python-pcre · PyPI

    https://pypi.org/project/python-pcre
    AndyAO
        12
    AndyAO  
    OP
       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
        13
    AndyAO  
    OP
       2021-03-10 10:44:02 +08:00
    mcfog 提供了很好的信息,原来 Python 的 re 是来自 C++ 的 re2,而且有大量的语言也用了这个实现,看来 re2 就是我想找的东西之一,在 .NET 上也可以用。
    AndyAO
        14
    AndyAO  
    OP
       2021-03-10 10:47:29 +08:00
    啊,感觉好像理解错了 Python 的 Re2 是在这里 ,README 上没说内置的是↓

    [google-re2 · PyPI]( https://pypi.org/project/google-re2/)
    newmlp
        15
    newmlp  
       2021-03-10 11:31:12 +08:00
    搞个 C\C++语言的库就行了,应该没有语言不支持 C\C++库吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:42 · PVG 04:42 · LAX 12:42 · JFK 15:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.