2013-02-16 16 views
16

Ich möchte eine Zeichenfolge aus einer Eingabedatei mit einer anderen Zeichenfolge ersetzen. Ich war auf der Suche nach einer Methode, aber es scheint, dass ich die Zeichenfolge nur Zeichen für Zeichen ändern kann. Zum Beispiel in dem meinem Code untenSo ersetzen Sie eine Zeichenfolge durch eine andere in Haskell

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 

Ich mag das erste Vorkommen der Zeichenfolge „@title“ zu finden, aber ich kann ein Verfahren scheinen zu finden, so zu tun, wie bereits erwähnt, kann ich nur die Zeichen zugreifen "@" Gibt es eine Methode, um eine solche Aufgabe zu erledigen?

+2

möglich Duplikat [Wie kann ich mit einem anderen einen Teil eine Zeichenkette ersetzen in Haskell ohne externe Bibliotheken wie MissingH?] (Http://stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without- Verwendung) –

+1

Ich denke, das wurde bereits hier diskutiert: http://stackoverflow.com/questions/14 880299/how-can-i-replace-a-Teilstring-of-String-mit-einem anderen-in-haskell-ohne-Verwendung – kaan

+1

Dies ist nicht wirklich ein Duplikat. Die andere Frage schließt ausdrücklich die Verwendung anderer Bibliotheken aus, was eine vernünftige Antwort auf diese Frage ist. –

Antwort

20

können Sie verwenden Data.List.Utils ersetzen, es ist faul und Sie können eine große Datei mit etwas wie verarbeiten:

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

Das ist alles!

Eine mögliche Ersetzen-Funktion könnte

rep a b [email protected](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 _ _ [] = [] 

andere intelligente Art und Weise (von Data.String.Utils)

replace :: Eq a => [a] -> [a] -> [a] -> [a] 
replace old new l = join new . split old $ l 
+11

Alternativ mit [Data.List.Split] (http://hackage.haskell.org/packages/archive/split/0.2.1.1/doc/html/Data-List-Split.html) aus dem Paket 'split' welches Teil der Haskell Platform ist, definiere 'ersetzen alt neu = interkaliere neu. splitOn alt'. –

Verwandte Themen