在SML NJ中,我想查找一个字符串是否是另一个字符串的子字符串并找到它的索引。任何人都能帮助我吗?
答案 0 :(得分:3)
Substring.position
函数是我在基础库中找到的唯一一个似乎可以进行字符串搜索的函数。不幸的是,Substring
模块很难使用,所以我编写了以下函数来使用它。只需传递两个字符串,如果找不到,则返回option
:NONE
,如果找到,则返回SOME
索引:
fun index (str, substr) = let
val (pref, suff) = Substring.position substr (Substring.full str)
val (s, i, n) = Substring.base suff
in
if i = size str then
NONE
else
SOME i
end;
答案 1 :(得分:0)
你有所有的子串函数,但是如果你想知道它的位置,那么最简单的就是自己做,用线性扫描。
基本上你想要爆炸两个字符串,然后将要查找的子字符串的第一个字符与源字符串的每个字符进行比较,每次失败时递增一个位置计数器。当您找到匹配项时,您也可以移动到子字符串中的下一个字符,而无需移动位置计数器。如果子字符串是“空”(当你留下空列表时建模)你已经匹配了所有并且你可以返回位置索引,但是如果匹配突然失败你必须返回到你第一次匹配时跳过一个字母(递增位置计数器)并重新开始。
希望这可以帮助您自己开始这样做。