我需要用单个选项卡替换字节字符串中的所有连续选项卡,如下所示:
"___\t___\t\t___\t\t\t___"
变成了
"___\t___\t___\t___"
我不知道该怎么做。
经过半个小时的弄清楚,我成功地替换了第一次出现的双制表符,如下所示(即使这实际上是错误的 - 它向空字符串添加了一个制表符):
import qualified Pipes.ByteString as PB
import qualified Data.ByteString as B
removeConsecutiveTabs =
PB.break (== tab) . mapped %~ \p -> do
yield (B.singleton tab)
PB.dropWhile (== tab) p
但是,我仍然不知道如何替换所有出现的连续选项卡。
最佳答案
试试这个:
{-# LANGUAGE OverloadedStrings #-}
import Pipes
import qualified Pipes.Prelude as P
import qualified Pipes.ByteString as PB
import Data.ByteString (ByteString)
import Control.Lens hiding (each)
cleanTabs p = do
p1 <- view (PB.span (/= 9)) p
x <- lift $ next p1
case x of
Left r -> return r
Right (a, p2) -> do
yield "\t"
let p3 = PB.dropWhile (== 9) (yield a >> p2)
cleanTabs p3
source :: Monad m => Producer ByteString m ()
source = each [ "this", "is\t an", "\t\texample\t", "\t.", "\t\tmiddle\t", "\there"]
example = do
putStrLn $ "input: " ++ (show $ P.toList source)
putStrLn $ "output:" ++ (show $ P.toList (cleanTabs source))
关于haskell - 如何使用管道将双选项卡替换为单选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157114/