如何编写正则表达式匹配指定规则多行文本并合并为单行
解决多行文本匹配与合并的正则问题
问题分析
你需要匹配并合并符合以下规则的文本块:
- 首行:大写字母开头,冒号结尾
- 后续连续行:每行含1-10个单词,首个单词大写开头,单词可包含
,-./等字符 - 最终将匹配块内的换行替换为
,
你的原正则无法区分行首大小写,核心问题是未开启多行模式、未限制连续匹配的终止条件,且单词匹配逻辑不准确。
修正后的正则表达式
使用以下正则(需开启全局+多行模式,即gm标志):
^([A-Z].*:\n)([A-Z][\w.,/-]*(?:\s+[\w.,/-]+){0,9}(?:\n[A-Z][\w.,/-]*(?:\s+[\w.,/-]+){0,9})*)
正则拆解
^([A-Z].*:\n):捕获首行,确保以大写字母开头、冒号结尾,且包含行尾换行[A-Z][\w.,/-]*(?:\s+[\w.,/-]+){0,9}:匹配单条符合要求的后续行:[A-Z][\w.,/-]*:首词以大写开头,允许包含字母、数字、下划线及,-./(?:\s+[\w.,/-]+){0,9}:匹配0-9个后续单词(加上首词共1-10个),非捕获组避免额外分组
(?:\n[A-Z][\w.,/-]*(?:\s+[\w.,/-]+){0,9})*:匹配连续的多行符合要求的内容,直到遇到不符合的行或文本结束gm标志:g全局匹配所有符合块,m让^/$匹配每行的开头/结尾
替换规则
将匹配到的内容中的\n替换为, 即可完成合并。
示例验证
正向示例1:
输入:My favorite books are as follows:\nA great book\nThe Effective Book onscala.io\nTest Book\n匹配后替换结果:
My favorite books are as follows:, A great book, The Effective Book onscala.io, Test Book正向示例2:
输入:My favorite books are as follows:\nA great book\nanother sentence\nAnother book\n仅匹配首行+第一行后续内容,替换结果:
My favorite books are as follows:, A great book反向示例:
输入:My favorite books are as follows:\na great book\nanother sentence\n后续行首为小写,无匹配结果,不执行替换。
原正则的问题点
- 未启用
m多行模式,导致^仅匹配整个文本的开头,而非每行开头 - 仅能匹配一行后续内容,无法处理连续多行符合要求的文本
- 单词匹配逻辑
[a-zA-Z0-9,.\/ ]+包含空格,会误匹配多余空白,且{1,10}的重复逻辑错误,可能导致单词数量超出限制 - 未设置终止条件,无论后续行是否符合规则都会匹配
内容的提问来源于stack exchange,提问作者vish
相关产品推荐
相关产品推荐

