Regex 排除OCaml正则表达式中的特定单词
我用JavaScript编写了这个正则表达式: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
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中使用?