排除OCaml RegEx中的特定单词

时间:2018-03-15 17:37:09

标签: regex ocaml flowtype

我在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不匹配,因为这个RegEx在RegEx 101中适用于JavaScript RegExes。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Str是POSIX样式语法中一个很好的旧OCaml regexp库。它不支持PCRE及其扩展。今天使用Str没有任何好处,除了它包含在OCaml编译器中。

您可能需要尝试完全支持PCRE的pcre-ocaml https://github.com/mmottl/pcre-ocaml

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