如何用正则捕获组匹配CSV中含换行的多行文本?
解决CSV多行内容的正则匹配问题
问题根源
你原来的正则([A-Z1-9]+)-\d*,(.*)有两个核心问题:
- 默认模式下,
.不匹配换行符,所以第二个捕获组遇到换行就停止; - 没有限定第二个捕获组的结束边界,导致无法精准截止到下一条记录的开头。
修正后的正则方案
使用带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
相关产品推荐
相关产品推荐

