20

入力ファイルの文字列を別の文字列に置き換えたい。メソッドを探していましたが、文字列を文字ごとにしか変更できないようです。たとえば、以下の私のコードでは

replace :: String -> String 
replace [] = [] 
replace (x:xs) = if x == '@' then 'y':replace xs --y is just a random char
                             else x:replace xs

searching :: String -> IO String
searching filename = do
    text <- readFile filename
    return(replace text)


main :: IO ()
main = do

  n <- searching "test.sf"
  writeFile "writefile.html" n 

文字列「@title」の最初の出現箇所を見つけたいのですが、前述のようにその方法が見つからないようです。文字「@」にしかアクセスできません。そのようなタスクを実行する方法はありますか?

4

1 に答える 1

22

Data.List.Utils replaceを使用できます。これは遅延であり、次のような大きなファイルを処理できます。

main = getContents >>= putStr . replace "sourceString" "destinationString"

それで全部です!

可能な置換機能は

rep a b s@(x:xs) = if isPrefixOf a s

                     -- then, write 'b' and replace jumping 'a' substring
                     then b++rep a b (drop (length a) s)

                     -- then, write 'x' char and try to replace tail string
                     else x:rep a b xs

rep _ _ [] = []

別の賢い方法(Data.String.Utilsから)

replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace old new l = join new . split old $ l
于 2013-02-16T08:54:21.180 に答える