String OCaml正则表达式和避免;尝试加上;

String OCaml正则表达式和避免;尝试加上;,string,pattern-matching,ocaml,String,Pattern Matching,Ocaml,我对OCaml完全陌生。我需要搜索行字符串中的数字。我正在使用Str.search\u forward来执行此操作。请参阅下面的代码片段。我所编写的代码工作正常,但另一个OCaml程序员说使用try。。。这是一个糟糕的OCaml实践。我可以使用Str.string\u match,但随后我必须使用字符串中的每个字符的位置来迭代该字符,以测试是否匹配。这似乎比我现在做的效率要低得多 请告诉我如何在OCaml中使用正则表达式来匹配字符串中的数字,而无需使用try。。。使用。谢谢 let find_p

我对OCaml完全陌生。我需要搜索行字符串中的数字。我正在使用Str.search\u forward来执行此操作。请参阅下面的代码片段。我所编写的代码工作正常,但另一个OCaml程序员说使用try。。。这是一个糟糕的OCaml实践。我可以使用
Str.string\u match
,但随后我必须使用字符串中的每个字符的位置来迭代该字符,以测试是否匹配。这似乎比我现在做的效率要低得多

请告诉我如何在OCaml中使用正则表达式来匹配字符串中的数字,而无需使用
try。。。使用
。谢谢

let find_page_hdr linestr =
    let r1 = Str.regexp "[0-9]+" in
    let pos =
        try
            Str.search_forward r1 linestr 0
        with Not_found -> -1
    in
    if pos >= 0
    then int_of_string (Str.matched_string linestr)
    else -1;;

首先,关于<代码>尝试。。。由于是一种不好的做法,您的朋友可能提到这主要是依赖类型安全性的问题。然而,使用负整数“C样式”更坏,因为它打破了类型安全和没有明确定义的语义。 在代码中返回
选项
类型可能比返回
-1
特殊值更可取

至于你的具体问题,我想你可以在<代码>Str.split

let get_all_ints s =
  List.map int_of_string (Str.split (Str.regex "[^0-9]+") s);;

这对你有用吗?

我不认为
试试。。。使用
是不好的OCaml编程实践。如果你移动
试试看,你的代码可能会更整洁一些。。。稍微向外一点。像这样的东西可能是好的:

let find_page_hdr linestr =
    try
        ignore (Str.search_forward (Str.regexp "[0-9]+") linestr 0);
        Some (int_of_string (Str.matched_string linestr))
    with Not_found -> None
您可以使用“本地打开”来消除一些混乱:

let find_page_hdr linestr =
    let open Str in
    try
        ignore (search_forward (regexp "[0-9]+") linestr 0);
        Some (int_of_string (matched_string linestr))
    with Not_found -> None

谢谢你的反馈!