ocaml Str.full_split 不 returns 原始字符串而不是预期的子字符串

ocaml Str.full_split does not returns the original string instead of the expected substring

我正在尝试编写一个程序来读取差异文件和 return 文件名,仅文件名。所以我写了下面的代码

open Printf
open Str
let syname: string = "diff --git a/drivers/usc/filex.c b/drivers/usc/filex"

let fileb = 
  let pat_filename = Str.regexp "a\/(.+)b" in
  let s = Str.full_split pat_filename syname in
  s

let print_split_res (elem: Str.split_result) =
  match elem with
  | Text t -> print_string t
  | Delim d -> print_string d

let rec print_list (l: Str.split_result list) =
  match l with
  | [] -> ()
  | hd :: tl -> print_split_res hd ; print_string "\n" ; print_list tl
;;

() = print_list fileb

在 运行 之后,我得到了原始的字符串 diff --git a/drivers/usc/filex.c b/drivers/usc/filex 作为输出。

而如果我对 python 标准库使用相同的正则表达式模式,我会得到想要的结果

import re
p=re.compile('a\/(.+)b')
p.findall("diff --git a/drivers/usc/filex.c b/drivers/usc/filex")

输出:['drivers/usc/filex.c ']

我做错了什么?

不是嘲讽,但理解 OCaml 正则表达式的方法是阅读文档,而不是与其他语言的东西进行比较:-)遗憾的是,跨语言的正则表达式没有真正的标准。

主要问题似乎是 OCaml 正则表达式中的括号与自身匹配。要获得分组行为,需要使用 '\' 对它们进行转义。换句话说,您的模式正在寻找文件名中的实际括号。如果您将正则表达式更改为:

,您的代码对我有用
Str.regexp "a/\(.+\)b"

请注意,反斜杠本身必须进行转义,以便 Str.regexp 能够看到它们。

您还遇到了您的模式与 b 之后的斜杠不匹配的问题。因此生成的文本将以斜杠开头。

作为旁注,我还删除了 / 之前的反斜杠,这在 OCaml 字符串中在技术上是不允许的。