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 字符串中在技术上是不允许的。
我正在尝试编写一个程序来读取差异文件和 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 字符串中在技术上是不允许的。