gpt4 book ai didi

haskell - Haskell 中子字符串替换的最佳方法

转载 作者:行者123 更新时间:2023-12-02 13:28:19 25 4
gpt4 key购买 nike

问题非常简单:我必须将所有出现的“fooo”及其所有子字符串替换为“xyz”。以Java为例,我会这样做:

someString.replaceAll( "fooo|foo|fo", "xyz" )

这样就可以了。但在 Haskell 中,我没有找到使用正则表达式的有效方法。首先,我读过这个:http://www.haskell.org/haskellwiki/Regular_expressions

唯一真正具有替换功能的库是 regex-posix,但它的性能被认为“非常慢”。而这个事实是 Not Acceptable 。我还发现这个 replace 函数出于任何原因都不遵守给定模式的顺序,所以我得到了这样的输出:

>replace "boo fooo boo" "xyz"
"boo xyzoo boo"

其他后端并不暗示此类功能。

所以我决定编写简单的解决方法:

replaceFoo input =
helper input []
where
helper ('f':'o':'o':'o':xs) ys = helper xs ("zyx" ++ ys)
helper ('f':'o':'o':xs) ys = helper xs ("zyx" ++ ys)
helper ('f':'o':xs) ys = helper xs ("zyx" ++ ys)
helper (x:xs) ys = helper xs (x:ys)
helper [] ys = reverse ys

虽然我觉得这个功能不太好,但它运行良好且快速。但现在我遇到了在这个 replacor 中添加更多单词的必要性,并且我不再喜欢扩展 helper 模式的想法(我需要说的是,我实际上有 4 个单词)应用程序,这很奇怪)。

如果有人帮助我快速解决方案,我会很高兴。

<小时/>

cebewee ,感谢 Data.String.Utils。但我担心如果有很多单词需要替换(“fooo”到“xyz”,“foo”到“xyz”,“fo”到“xyz”,“bar”到“quux”等等),这种方法会很慢),因为要使其工作,我需要 foldr (\str (from,to) -> Replace from to str) 输入对 或类似的东西,并且需要 O(n*n )。不仅如此,替换先前替换结果的子字符串可能会产生意想不到的结果。

最佳答案

Data.String.Utils.replace在 MissingH 包中。如果您只需要纯子字符串替换(而不是正则表达式),这可能就是您所需要的。

关于haskell - Haskell 中子字符串替换的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5230700/

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