haskell中子串替换的最佳方法

pec*_*nie 7 haskell replace substring

问题很简单:我必须用"xyz"替换所有出现的"fooo"及其所有子串.例如,在Java中,我将这样做:

someString.replaceAll( "fooo|foo|fo", "xyz" )
Run Code Online (Sandbox Code Playgroud)

它会做的伎俩.但在Haskell中,我发现没有有效的方法来使用正则表达式.首先,我读过这个:http://www.haskell.org/haskellwiki/Regular_expressions

实际上具有replace函数的唯一库是regex-posix,但它在性能上被认为"非常慢".这个事实是不可接受的.另外我发现这个replace函数由于任何原因不符合给定模式的顺序,所以我得到这样的输出:

>replace "boo fooo boo" "xyz"
"boo xyzoo boo"
Run Code Online (Sandbox Code Playgroud)

其他后端并不意味着这样的功能.

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

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
Run Code Online (Sandbox Code Playgroud)

虽然我发现这个功能不太好,但效果很好而且速度很快.但是现在我遇到了在这个替换中添加更多单词的必要性,我不喜欢扩展helper模式的想法(我需要说实际应用程序中我实际上有4个单词,这很奇怪).

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


cebewee,感谢Data.String.Utils.但我担心如果要替换很多单词("fooo"到"xyz","foo"到"xyz","fo"到"xyz","bar"到"quux"等等,这种方法很慢),因为为了foldr (\str (from,to) -> replace from to str) input pairs让它工作,我将需要或类似的东西,它将需要O(n*n).更重要的是,它可能有意外的结果替换先前替换的结果的子串.

Lar*_*ski 7

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