Лучший способ замены подстроки в haskell
Задача довольно проста: я должен заменить все случаи "fooo" и все его подстроки на "xyz". В Java, например, я сделаю это так:
someString.replaceAll( "fooo|foo|fo", "xyz" )
И это будет делать трюк. Но в Хаскелле я не нашел эффективного способа работать с регулярным выражением. Прежде всего, я прочитал следующее: http://www.haskell.org/haskellwiki/Regular_expressions
Единственная библиотека, которая на самом деле имеет функцию
replace,-это regex-posix, но она считается "очень медленной" по производительности. И этот факт не приемлем. Кроме того, я обнаружил, что эта функция replace по каким-либо причинам не соблюдает порядок заданных паттернов, поэтому я получил такой вывод: >replace "boo fooo boo" "xyz"
"boo xyzoo boo"
Другие бэкенды не подразумевают такой функциональности.
Поэтому я решил написать простой обходной путь:
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
Хотя я не нахожу эту функцию приятной, она работает хорошо и быстро. Но сейчас я столкнулся с необходимостью добавить больше слов в этот заменитель, и мне больше не нравится идея расширения helper шаблонов (мне нужно скажите, что у меня на самом деле есть 4 слова в нем в реальном приложении, и это странно).
Я буду счастлив, если кто-нибудь поможет мне с быстрым решением.
Cebewee , Спасибо за данные.Строка.А utils. Но я боюсь, что этот подход довольно медленный, если нужно заменить много слов ("Foo" на "xyz", "foo" на "xyz", "fo" на "xyz", "bar" на "quux" и т. д.), Потому что для того, чтобы это сработало, мне нужно будет foldr (str (from,to) -> replace from to str) input pairs или что-то в этом роде, и это займет O(n*n). Более того, он может иметь неожиданный результат замены подстроки результата предыдущей замены.
2 ответов:
Пакет regex-xmlschema имеет функцию sed, которая может быть тем, что вы ищете:
Http://hackage.haskell.org/package/regex-xmlschema-0.1.3
См. в частности:
На Haskell-Cafe last состоялось обсуждение вариантов перезаписи строк. год:
Http://www.haskell.org/pipermail/haskell-cafe/2010-May/077943.html
Есть Данные.Строка.А utils.заменить в пакете MissingH. Если вам нужна только простая замена подстроки (а не регулярные выражения), это может быть то, что вам нужно.
Comments