Regex 如何在OCaml中获得与模块Str的完全(急切)匹配

Regex 如何在OCaml中获得与模块Str的完全(急切)匹配,regex,ocaml,Regex,Ocaml,几个小时以来,我一直在为这个标准问题寻找合适的函数,例如在Tcl shell中: str@suse131-intel:~> tclshi % regexp -inline {[0-9]+} "I am trying this for the 1001. time!!" 1001 % 我已经尝试了很多,我可以找到比赛的开始和结束,但这不可能!我只得到一个最小匹配,而不是一个渴望匹配。可以这么说,我是不是应该用手把火柴挑出来?Ocaml交互式: # let s1 = "this is the

几个小时以来,我一直在为这个标准问题寻找合适的函数,例如在Tcl shell中:

str@suse131-intel:~> tclshi
% regexp -inline {[0-9]+} "I am trying this for the 1001. time!!"
1001
%
我已经尝试了很多,我可以找到比赛的开始和结束,但这不可能!我只得到一个最小匹配,而不是一个渴望匹配。可以这么说,我是不是应该用手把火柴挑出来?Ocaml交互式:

# let s1 = "this is the 1001. time I am trying this.";;
val s1 : string = "this is the 1001. time I am trying this."
# search_forward (regexp "[0-9]+") s1 0;;
- : int = 12
# group_beginning 0;;
- : int = 12
# group_end 0;;
- : int = 16
子问题:所有这些引用最后一个匹配的函数(如文档所述,返回最后一次调用所匹配的s的子字符串,该子字符串与下面的一个匹配)与matched_string看起来不太像FP,但恰恰相反。我可以使用这个可重入和任务切换保存代码吗

编辑:在昨天的课程中,我只找回了一个号码。现在我想把这个奇怪的行为复制到这个问题中,但它工作得很好。问题可能是不同let定义的混淆

完整示例:

# #require "str";;
/usr/lib64/ocaml/str.cma: loaded
# open Str;;
# let s1 = "this is the 1001. time I am trying this.";;
val s1 : string = "this is the 1001. time I am trying this."
# search_forward (regexp "[0-9]+") s1 0;;
- : int = 12
# matched_string s1;;
- : string = "1001"

OCaml代码似乎与tcl代码完全匹配,所以我不确定您需要什么额外的热情


没错,这个字符串匹配接口不起作用。它取决于隐藏状态,很可能不是线程安全的。有Str.search,这稍微好一点,它建议界面的非FP部分应被视为过时。

您可能想尝试新的库。它是更新的,可能API更好。我知道,有extlib,电池,简街的东西和。。。你可以说出来,但在深入研究这些之前,我想确定我已经理解了ocaml内置模块的可能性。@AshishAgarwal与str兼容的api是同一个丑陋的非线程安全api。我不认为它的任何其他前端都是完整的。我得到了匹配的位置,但我没有得到匹配。所以我必须做一个字符串。sub?是的,你需要自己拔出substring。毫无疑问,拥有一个更友好的界面会很好。