嗨,我一直在互联网上寻找一种在 OCaml 中实现“字符串是否以特定文本结尾”的好方法,我发现与其他编程语言(如 Java)相比,在 OCaml 中操作字符串并不像我预期的那么简单.
这是我的 OCaml 代码,使用 Str.regexp 检查 文件 名称以“ .ml ”结尾,以查看它是否是 OCaml 脚本文件。它没有像我预期的那样工作:
let r = Str.regexp "*\\.ml" in
if (Str.string_match r file 0)
then
let _ = print_endline ("Read file: "^full_path) in
readFile full_path
else
print_endline (full_path^" is not an OCaml file")
请注意 读取文件 是我自己写的用来读取的函数文件 从构造的完整路径。我总是在输出中得到结果,例如
./utilities/dict.ml is not an OCaml file
./utilities/dict.mli is not an OCaml file
./utilities/error.ml is not an OCaml file
./utilities/error.mli is not an OCaml file
我在 OCaml 中的正则表达式有什么问题,是否有更好/更简单的代码来检查字符串?
最佳答案
首先你的正则表达式不正确,你忘了.
在 *
之前,正确的版本是:
let r = Str.regexp {|.*\.ml|}
请注意新字符串文字语法的使用,它允许您以更好的方式编写正则表达式,而无需大量反斜杠。使用带有双引号的常规语法,它应该如下所示:
let r = Str.regexp ".*\\.ml"
这个正则表达式并不理想,因为它会匹配
file.mlx
, file.ml.something.else
等等。所以,一个更好的版本,将与所有可能的 OCaml 源文件名匹配,是let r = Str.regexp {|.*\.ml[ily]?$|}
除了使用正则表达式,您还可以使用
Filename
标准库中的模块,具有 check_suffix
功能:let is_ml file = Filename.check_suffix file ".ml"
检查所有可能的扩展:
let srcs = [".ml"; ".mli"; ".mly"; ".mll"]
let is_ocaml file = List.exists (Filename.check_suffix file) srcs
关于regex - 检查字符串是否以 OCaml 中的某些文本结尾的最方便方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37857728/