Лучший способ замены подстроки в 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). Более того, он может иметь неожиданный результат замены подстроки результата предыдущей замены.

660   2  

2 ответов:

Пакет regex-xmlschema имеет функцию sed, которая может быть тем, что вы ищете:

Http://hackage.haskell.org/package/regex-xmlschema-0.1.3

См. в частности:

Http://hackage.haskell.org/packages/archive/regex-xmlschema/0.1.3/doc/html/Text-Regex-XMLSchema-String.html#v:sed

На Haskell-Cafe last состоялось обсуждение вариантов перезаписи строк. год:

Http://www.haskell.org/pipermail/haskell-cafe/2010-May/077943.html

Есть Данные.Строка.А utils.заменить в пакете MissingH. Если вам нужна только простая замена подстроки (а не регулярные выражения), это может быть то, что вам нужно.

Comments

    Ничего не найдено.