You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中如何按两个连续换行符分割字符串

需求说明

给定按空行分隔的文本,将其拆分为文本块列表:

  • 块之间的一个或多个空行作为分隔符,直接丢弃
  • 每个块内部的换行符保留

输入示例:

abc

a
b
c

abc
abc
abc
abc

期望输出(Haskell列表格式):

[ "abc"
, "a\nb\nc"
, "abc\nabc\nabc\nabc"]

之前尝试用正则实现时遇到两个问题:

  • 无法导入Text.Regex模块
  • Text.Regex.Base模块未导出splitStr函数
实现方案

不需要依赖正则库,Haskell自带的base库就可以实现,完全避免导入问题。
核心逻辑:先把输入按行拆分,将连续的非空行归为一组,每组内部用换行拼接即可。

纯base无依赖实现

不需要安装任何第三方包,代码如下:

splitOnBlankLines :: String -> [String]
splitOnBlankLines = map unlines . splitOnBlank . lines
  where
    splitOnBlank [] = []
    splitOnBlank xs =
      let (currentGroup, remain) = break null xs
          remain' = dropWhile null remain
      in if null currentGroup
           then splitOnBlank remain'
           else currentGroup : splitOnBlank remain'

函数逻辑说明:

  1. lines将完整输入按换行符拆分为行列表,空行对应列表中的空字符串""
  2. splitOnBlank递归拆分列表:遇到空行就截断为一组,自动跳过连续的多个空行,不会生成空分组
  3. unlines将每组的行列表重新用换行符拼接,得到最终的文本块

简化实现(依赖通用split包)

如果项目中已经引入了常用的split工具包,可以直接调用内置的分割函数,不用自己写递归:

import Data.List.Split (splitWhen)

splitOnBlankLines :: String -> [String]
splitOnBlankLines = map unlines . splitWhen null . lines
正则方案报错原因
  • Text.Regex不属于base库,由第三方包regex-compat提供,未安装该包时会导入失败
  • Text.Regex.Base是正则库的底层抽象模块,本身不提供字符串分割类的高层工具函数,自然不会导出splitStr

内容的提问来源于stack exchange,提问作者c-devhax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:02:01