确保 OCaml 中的正则表达式匹配整个输入字符串的最佳方法是什么?

What is the best way to ensure a regex in OCaml matches the entire input string?

在 OCaml 中,我试图检查正则表达式是否匹配 整个 输入字符串,而不仅仅是前缀或后缀或第一个输入字符串之前的部分换行符。

例如,我想避免 [0-9]+ 的正则表达式匹配如下字符串:

let negative_matches = [
    "  123"; (* leading whitespace *)
    "123  "; (* trailing whitespace *)
    "123\n"; (* trailing newline *)
]

当尾随字符与模式不匹配时,我看到 Str.string_match 仍然 returns true:

# List.map (fun s -> Str.string_match (Str.regexp "[0-9]+") s 0) negative_matches;;
- : bool list = [false; true; true]

$ 添加到模式中有助于第二个示例,但 $ 被记录为仅“匹配行尾”,因此第三个示例仍然匹配

# List.map (fun s -> Str.string_match (Str.reg  exp "[0-9]+$") s 0) negative_matches;;
- : bool list = [false; false; true]

我没有看到真正的“字符串结尾”匹配器(如 Java 和 Ruby 中的 \z),所以我找到的最佳答案是另外使用 Str.match_end:

检查输入字符串的长度与匹配的长度
# List.map (fun s -> Str.string_match (Str.reg  exp "[0-9]+") s 0 && Str.match_end () = String.length s) negative_matches;;
- : bool list = [false; false; false]

请告诉我我遗漏了一些明显的东西,还有更简单的方法。

编辑:请注意,我并不总是希望匹配像 [0-9]+ 这样的简单正则表达式。我想要一种将任意正则表达式与整个输入字符串进行匹配的方法。

你错过了一些明显的东西。有一个更简单的方法。如果

[^0-9]

在输入字符串中匹配你会知道它包含一个non-digit字符。


不幸的是,我认为 Str 没有比您自己的解决方案或类似的、稍微更清晰的替代方案更好的方法来确保整个字符串已匹配:

Str.string_match (Str.regexp "[0-9]+") s 0 && Str.matched_string s = s

或者您可以只检查是否存在换行符,因为正如您所展示的那样,这是美中不足的地方。

当然,还有其他可用的正则表达式库没有这个问题。

试试这个作为你的例子

(?<![^A-z]|\w)[0-9]+(?![^A-z]|\w)

test it here 如果你想生成其他模式,你可以从了解这个开始

(?之前你想要的组')

(?!'任何你不希望它出现的组你的愿望之后')