regex - Haskell 在一次传递中用正则表达式替换多个子字符串

标签 regex haskell

假设我有一个字符串 s 和一个字符串元组列表 ts,其中元组中的第一个元素是 s 的子字符串> 我想替换为相应的第二个元素。就我而言,字符串 s 将始终是一个以空格分隔的不同单词列表;此外,我希望将 s 中的每个单词全部替换为 ts 中的相应值(我希望我的意图在这里很清楚)。第一次尝试可能是:

import qualified Text.Regex as R -- from regex-compat    

replaceAllIn :: String -> [(String, String)] -> String
replaceAllIn = foldl (\acc (k, v) -> R.subRegex (R.makeRegex k) acc v)

当然,当一个键是另一个键的子字符串时,这不起作用

λ> s = "blah blahblee"
λ> ts = [("blah", "asdf"), ("blahblee", ";lkj")]
λ> replaceAllIn s ts
"asdf asdfblee"

因为第一个键在第一次传递时替换了两次出现的“blah”,留下的字符串在第二次传递时不再有任何匹配“blahblee”的内容。

有没有办法一次性通过字符串来实现我想要的效果?或者是否有一种内置方法(在某个库中的某个地方)可以一次替换多个模式?

编辑:发布后我立即意识到我不知道为什么在这里使用正则表达式。但如果我用 MissingH 的 Data.String.Utils 中的 replace 替换正则表达式,问题仍然有效。

最佳答案

扩展我之前的评论,您可以先处理要替换的最长字符串:

λ> s = "blah blahblee"
λ> ts = [("blah", "asdf"), ("blahblee", ";lkj")]
λ> import qualified Data.List as L
λ> replaceAllIn s (L.sortOn fst ts)
"asdf ;lkj"

关于regex - Haskell 在一次传递中用正则表达式替换多个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571481/

相关文章:

javascript - 子字符串上的 indexOf 和 lastIndexOf 问题 - 从字符串获取 URL 的一部分

php - 正则表达式取代 reg 商标

haskell - Linter 说多余的 lambda,但是当按照建议替换时它会给出不同的错误

haskell - 非纯函数破坏可组合性是什么意思?

haskell - 在模板 haskell 中运行模板 haskell

haskell - Yesod 1.2 CSRF 保护

python - 正则表达式如何匹配一致的标志?

javascript - 未终止的正则表达式文字js错误

java - 拆分嵌套字符串保留引号

haskell - GHC 拆分性能