【发布时间】:2012-02-04 05:12:18
【问题描述】:
在 SML NJ 中,我想查找一个字符串是否是另一个字符串的子字符串并找到它的索引。谁能帮我解决这个问题?
【问题讨论】:
在 SML NJ 中,我想查找一个字符串是否是另一个字符串的子字符串并找到它的索引。谁能帮我解决这个问题?
【问题讨论】:
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;
【讨论】:
你有所有的子字符串函数,但是如果你还想知道它的位置,那么最简单的方法就是自己做,用线性扫描。
基本上你想分解两个字符串,然后将你想要找到的子字符串的第一个字符与源字符串的每个字符进行比较,每次失败时增加一个位置计数器。当您找到匹配项时,您也会移动到子字符串中的下一个字符而不移动位置计数器。如果子字符串是“空的”(当你留下空列表时建模)你已经匹配了它并且你可以返回位置索引,但是如果匹配突然失败你必须返回到你第一次匹配的时候并且跳过一个字母(增加位置计数器)并重新开始。
希望这可以帮助您开始自己做这件事。
【讨论】: