Regex 排除OCaml正则表达式中的特定单词

Regex 排除OCaml正则表达式中的特定单词,regex,ocaml,flowtype,Regex,Ocaml,Flowtype,我用JavaScript编写了这个正则表达式: node_modules\/(?!react\-hot).*-loader.* 其思想是匹配每个字符串,如node\u modules/babel loader或node\u modules/css loader,但排除node\u modules/react hot loader (这里的上下文是我正在写一篇文章) 我试图在OCaml中测试相同的正则表达式,但没有成功: # let regexp = Str.regexp "node_modu

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

node_modules\/(?!react\-hot).*-loader.*
其思想是匹配每个字符串,如
node\u modules/babel loader
node\u modules/css loader
,但排除
node\u modules/react hot loader

(这里的上下文是我正在写一篇文章)

我试图在OCaml中测试相同的正则表达式,但没有成功:

# 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
#让regexp=Str.regexp“node_modules/(?!react hot)。*-loader.*;;

val regexp:Str.regexp=,我找不到任何可能导致这种行为差异的东西。

显然,
在OCaml正则表达式中不是特殊字符。看来您正在使用一个不受支持的功能。

Str
是POSIX风格语法中的一个很好的旧OCaml regexp库。它不支持PCRE及其扩展。现在使用
Str
没有任何好处,只是它包含在OCaml编译器中

您可能需要尝试完全支持pcre的
pcre ocaml


甚至还有另一个名为
ocamlre
的ocamlregexp库。它较新,纯用OCaml编写,支持多种regexp语法风格(POSIX、PCRE、glob),但在我看来,目前不支持否定前瞻
(?!…)
(我试图解析您的regexp,但它拒绝了
(?!…)
部分),我刚刚重新阅读了我在问题中链接到的官方文件,看来你是对的。似乎OCaml正则表达式不支持否定,这意味着我试图做的可能根本不可能。我认为应该有另一种方式。否定不会增加表达力。这意味着有一个OCaml正则表达式可以满足您的需要,尽管可能不是一个简单或好的正则表达式。我不知道为什么OCaml正则表达式不支持否定,但一个可能的好原因是否定会导致组合爆炸(状态空间求幂)。这些库如何在flowconfig中使用?