【问题标题】:Excluding a specific word in OCaml RegEx排除 OCaml RegEx 中的特定单词
【发布时间】:2018-08-24 15:26:41
【问题描述】:

我用 JavaScript 写了这个正则表达式:

node_modules\/(?!react\-hot).*-loader.*

这个想法是匹配每个字符串,如node_modules/babel-loadernode_modules/css-loader,但排除node_modules/react-hot-loader

Here is a regex101 link of this working.

(这里的上下文是我正在写Flowtype config file)。

我正在尝试在 OCaml 中测试相同的 RegEx,但我没有成功:

# let regexp = Str.regexp "node_modules/(?!react-hot).*-loader.*";;
val regexp : Str.regexp = <abstr>
# Str.string_match regexp "node_modules/babel-loader" 0 ;;
- : bool = false
# Str.string_match regexp "node_modules/react-hot-loader" 0 ;;
- : bool = false

我不明白为什么babel-loader 字符串与正则表达式不匹配,因为这个正则表达式在 RegEx 101 中适用于 JavaScript 正则表达式。

我了解 OCaml 正则表达式不遵循与 JavaScript 正则表达式相同的标准。但是,在阅读了官方文档here 中有关 OCaml 正则表达式的内容后,我找不到任何可能导致这种行为差异的内容。

【问题讨论】:

    标签: regex ocaml flowtype


    【解决方案1】:

    Str 是 POSIX 样式语法中一个很好的旧 OCaml 正则表达式库。它不支持 PCRE 及其扩展。今天使用Str 没有任何优势,只是它包含在 OCaml 编译器中。

    你可以试试pcre-ocamlhttps://github.com/mmottl/pcre-ocaml,它完全支持PCRE。

    甚至还有另一个名为 ocaml-re https://github.com/ocaml/ocaml-re 的 OCaml 正则表达式库。它较新并且纯粹用 OCaml 编写,并且支持多种正则表达式语法风格(POSIX、PCRE、glob),但在我看来,目前不支持否定前瞻 (?!..)(我试图解析你的正则表达式但它拒绝了(?!..) 部分)。

    【讨论】:

    • 如何在 flowconfig 中使用这些库?
    【解决方案2】:

    显然,! 不是 OCaml 正则表达式中的特殊字符。因此,您似乎正在使用不受支持的功能。

    【讨论】:

    • 糟糕,我刚刚重新阅读了我在问题中链接到的官方文档,看来您是对的。似乎 OCaml RegEx 不支持否定,这意味着我正在尝试做的事情可能根本不可能。我认为应该有另一种方式。
    • 否定不会增加表现力。这意味着有一个 OCaml 正则表达式可以满足您的需求,尽管它可能不是一个简单或好的表达式。我不知道为什么 OCaml 正则表达式不支持否定,但一个可能的很好的原因是否定导致组合爆炸(状态空间求幂)。
    猜你喜欢
    • 2017-10-02
    • 2018-01-15
    • 2014-06-04
    • 2021-04-20
    • 1970-01-01
    • 2021-12-25
    • 2013-09-06
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多