gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:40:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com