如何使用正则表达式匹配多行结构的header及其对应0~N个value
原有正则的问题
你编写的初始正则存在三处核心错误:
- value匹配规则中的
[^\s]未添加长度量词,仅能匹配单个非空白字符,无法识别长度大于1的value内容 - 重复捕获组默认仅会保留最后一次匹配的内容,无法收集header下对应的全部value条目
- 未开启多行匹配模式时,
^和$锚点仅能匹配整个文本的首尾位置,无法逐行识别header、value的行边界
正确正则模式
开启多行匹配模式(m修饰符)后使用如下模式即可:
^(?P<header>\S+)$(?:\r?\n\t(?P<value>\S+))*
注:
\S是[^\s]的等价简写,\r?\n可同时兼容Unix风格\n换行和Windows风格\r\n换行
使用说明
- 若使用PCRE2、Python regex库等支持重复命名捕获组自动聚合的引擎,该模式可直接返回每个匹配结果下的1个header值,以及对应0到N个value值的列表
- 若使用的引擎不支持重复捕获组聚合,可先通过该模式匹配出每个header及其下属所有value的完整文本块,再在块内提取所有以制表符开头的value行即可
- 模式默认匹配header下方连续缩进的value行,遇到下一个无缩进的header行时会自动结束当前匹配块
内容的提问来源于stack exchange,提问作者José D.
相关产品推荐
相关产品推荐

