假设我有一个字符串 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/