gpt4 book ai didi

string - 用列表中的字符串替换字符串

转载 作者:行者123 更新时间:2023-12-04 22:32:40 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数采用搜索词列表、替换词列表和将使用这些词的字符串。

listReplace :: [String] -> [String] -> String -> String

棘手的部分是,如果合适的搜索词是第 n 个,那么应该使用第 n 个替换词。此外,当一个替换词被使用时,如果它实际上是一个搜索词本身,则不应被另一个替换词替换。我已经为
replace :: String -> String -> String -> String:
replace x y [] = []
replace x y (z:zs) = if isPrefixOf x (z:zs) then y ++ replace x y (drop (length x) (z:zs)) else z: (replace x y zs)


replace' :: String -> [String] -> String -> String:
replace' x y [] = []
replace' x [] (z:zs) = []
replace' x y (z:zs) = if isPrefixOf x (z:zs) then concat (take 1 y) ++ replace' x (drop 1 y) (drop (length x) (z:zs)) else z: (replace' x y zs)

我只是不知道如何从这个 replaceList 函数开始,到目前为止我发现的唯一可能真正有用的是一个替换列表中第 n 个元素的函数。但我似乎无法弄清楚如何在这种情况下使用它:
replace :: Int -> a -> [a] -> [a]
replace n a [] = []
replace 0 a (x:xs) = a : xs
replace n a (x:xs) = x : replace (n-1) a xs

希望你们中的一个能帮助我!提前致谢 :)

最佳答案

我会建议一种不同的类型

listReplace :: [String] -> [String] -> String -> String

如果有人打电话会发生什么
listReplace ["one", "two"] ["een"] "I have two problems"

将找到子字符串“two”,但没有提供替代它。

而是使用
listReplace :: [(String, String)] -> String -> String

这样您就可以保证总是有与您搜索的模式一样多的替换字符串。

然后可以使用一个简单的实现
find :: (a -> Bool) -> [a] -> Maybe a

Data.List 检查是否有任何提供的模式是剩余输入的前缀,
listReplace _ "" = ""
listReplace replacements string@(c:cs)
= case find ((`isPrefixOf` string) . fst) replacements of
Just (pat,rep) -> rep ++ listReplace replacements (drop (length pat) string)
Nothing -> c : listReplace replacements cs

这个简单的解决方案不是很有效——这将需要更复杂的算法——并且它不会检测要替换的模式之一是否是另一个模式的前缀,因此如果较短的模式出现在列表中较长的模式之前,即使应该使用,也永远不会使用更长的模式。这可以通过在调用替换函数之前对替换列表进行排序来处理,例如按字典顺序降序。

关于string - 用列表中的字符串替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415846/

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