regex - 检查字符串是否以 OCaml 中的某些文本结尾的最方便方法?

标签 regex string ocaml

嗨,我一直在互联网上寻找一种在 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/

相关文章:

正则表达式以随机顺序精确显示字符数

java - 理解字符串模式的问题

module - 扩展递归模块

用于类型检查类似于 ML 的模式匹配的算法?

python - 用于查找 { } 内所有文本的正则表达式,包括空格和换行符

嵌套的Java正则表达式

c# - 替换单词,但仅在特定行上

javascript - 仅当 JavaScript 中子字符串长于 x 时才从子字符串中删除字符

java - 如何在java中实现字符串的近似匹配?

ocaml - 如何在 OCaml 中使用 #use 指令包含其他源文件?