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

如何用正则捕获组匹配CSV中含换行的多行文本?

解决CSV多行内容的正则匹配问题

问题根源

你原来的正则([A-Z1-9]+)-\d*,(.*)有两个核心问题:

  1. 默认模式下,.不匹配换行符,所以第二个捕获组遇到换行就停止;
  2. 没有限定第二个捕获组的结束边界,导致无法精准截止到下一条记录的开头。

修正后的正则方案

使用带DOTALL模式的正则,同时通过正向预查限定结束边界:

(ABC-\d+),(.*?)(?=ABC-|$)

关键说明:

  • ABC-\d+:精准匹配以ABC-开头的记录标识(替代原来的[A-Z1-9]+,更贴合你的实际数据);
  • .*?:非贪婪匹配所有内容(开启DOTALL后会包含换行符);
  • (?=ABC-|$):正向预查,匹配到下一个ABC-开头的位置或者文件结尾时停止,不会消耗ABC-字符,保证下一条记录能被正常捕获。

启用DOTALL模式的示例(以Python为例):

import re

pattern = re.compile(r'(ABC-\d+),(.*?)(?=ABC-|$)', re.DOTALL)
test_str = """ABC-1,01/01/1974,X1,Y1,Z1,"RANDOM SINLGE LINE TEXT 1",
ABC-2,01/01/1974,X2,Y2,Z2,"THIS IS
A RANDOM

MULTI LINE
TEXT 2",
ABC-3,01/01/1974,X3,Y3,Z3,"THIS IS

ANOTHER RANDOM
MULTI LINE TEXT","""

matches = pattern.findall(test_str)
for idx, match in enumerate(matches, 1):
    print(f"匹配{idx}:组1:{match[0]},;组2:{match[1]}")

匹配结果

运行后会得到你期望的3个匹配:

  • 匹配1:组1:ABC-1,;组2:01/01/1974,X1,Y1,Z1,"RANDOM SINLGE LINE TEXT 1",
  • 匹配2:组1:ABC-2,;组2:01/01/1974,X2,Y2,Z2,"THIS IS\nA RANDOM\n\nMULTI LINE\nTEXT 2",
  • 匹配3:组1:ABC-3,;组2:01/01/1974,X3,Y3,Z3,"THIS IS\n\nANOTHER RANDOM\nMULTI LINE TEXT",

额外建议

虽然正则能解决这个问题,但处理CSV更可靠的方式是用专门的CSV解析库(比如Python的csv模块、Java的OpenCSV等),这些库已经内置处理多行字段、引号转义等边缘场景的逻辑,避免正则可能出现的遗漏。

内容的提问来源于stack exchange,提问作者Anish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:55:25