从Haskell中的字符串替换子字符串

J. *_*Doe 2 string haskell replace functional-programming

我有以下字符串"not really//",我想写一个函数,"//"用两个点替换每两个斜杠".."

我想过使用map,但后来我会遍历字符并且无法知道斜杠是否会被另一个跟随.有任何线索如何做到这一点?(没有正则表达式)

Wil*_*sem 8

我们可以使用replace :: Text -> Text -> Text -> Text函数的Data.Text功能。例如:

Prelude Data.Text> replace "//" ".." "not really//"
"not really.."
Run Code Online (Sandbox Code Playgroud)

在这里,我们在Texts 上工作。如果存在问题,我们还可以使用pack :: String -> Textunpack :: Text -> StringString和之间进行转换Text。因此我们可以定义一个函数:

{-# LANGUAGE OverloadedStrings #-}

import Data.Text(pack, unpack, replace)

replacedoubleslash :: String -> String
replacedoubleslash = unpack . replace "//" ".." . pack
Run Code Online (Sandbox Code Playgroud)

但是通常对于有效的字符串处理(从速度和内存而言),使用Text优于使用Strings。


chi*_*chi 5

显式递归在这里看起来很好:

replace :: String -> String
replace ('/':'/':xs) = '.' : '.' : replace xs
replace (x:xs)       = x : replace xs
replace ""           = ""
Run Code Online (Sandbox Code Playgroud)

这不会扩展到长模式,但是为了替换"//"它应该可以正常工作.