J. *_*Doe 2 string haskell replace functional-programming
我有以下字符串"not really//",我想写一个函数,"//"用两个点替换每两个斜杠".."
我想过使用map,但后来我会遍历字符并且无法知道斜杠是否会被另一个跟随.有任何线索如何做到这一点?(没有正则表达式)
我们可以使用replace :: Text -> Text -> Text -> Text函数的Data.Text功能。例如:
Prelude Data.Text> replace "//" ".." "not really//"
"not really.."
Run Code Online (Sandbox Code Playgroud)
在这里,我们在Texts 上工作。如果存在问题,我们还可以使用pack :: String -> Text和unpack :: Text -> String在String和之间进行转换Text。因此我们可以定义一个函数:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text(pack, unpack, replace)
replacedoubleslash :: String -> String
replacedoubleslash = unpack . replace "//" ".." . pack
Run Code Online (Sandbox Code Playgroud)
但是通常对于有效的字符串处理(从速度和内存而言),使用Text优于使用Strings。
显式递归在这里看起来很好:
replace :: String -> String
replace ('/':'/':xs) = '.' : '.' : replace xs
replace (x:xs) = x : replace xs
replace "" = ""
Run Code Online (Sandbox Code Playgroud)
这不会扩展到长模式,但是为了替换"//"它应该可以正常工作.