如何编写Regex匹配含多次特定字符串的START-END行组?
问题:匹配包含多次MIDDLE的START-END行组
现有多行文本文件内容如下:
START
MIDDLE
RANDOM
MIDDLE
END
START
MIDDLE
RANDOM
END
START
MIDDLE
RANDOM
MIDDLE
END
需要编写正则表达式,仅匹配其中MIDDLE出现超过一次的START-END行组,即如下加粗部分:
START
MIDDLE
RANDOM
MIDDLE
END
START
MIDDLE
RANDOM
END
START
MIDDLE
RANDOM
MIDDLE
END
尝试过以下正则及变体,但未匹配到目标行组:
(START(?:\nMIDDLE){2,}(?:\nMIDDLE)*\nEND) (START\*STUFF~(?:\nMIDDLE\*STUFF~){2,}(?:\nMIDDLE\*STUFF~)*\nEND\*STUFF~)
寻求正确的正则表达式解决方案。
解决方案
可用正则表达式
要匹配包含至少两个MIDDLE的START-END行组,你可以使用以下正则(需启用多行模式):
START(?:\n(?!START|END).*)*\nMIDDLE(?:\n(?!START|END).*)*\nMIDDLE(?:\n(?!START|END).*)*\nEND
如果需要更灵活的写法(明确校验至少两个MIDDLE),可以用带正向预查的版本:
START(?=(?:\n(?!START|END).*)*\nMIDDLE){2}(?:\n(?!START|END).*)*\nEND
为什么你的正则没生效
你之前的写法要求MIDDLE必须连续换行出现,但实际目标行组里MIDDLE之间有RANDOM这类其他行,所以无法匹配。另外,你没有处理START、MIDDLE、END之间的任意非边界内容,导致正则无法跳过中间的随机行。
正则逻辑拆解
START:定位每个行组的起始标记(?:\n(?!START|END).*)*:匹配任意以换行开头的非START/END行,用来跳过RANDOM这类中间内容,同时避免跨到其他START-END组- 重复的
\nMIDDLE(?:\n(?!START|END).*)*:确保至少出现两次MIDDLE,中间允许穿插任意非边界行 \nEND:定位行组的结束标记
使用注意
- 必须启用正则引擎的多行模式(对应
m标志),确保行边界判断准确 - 不要开启DOTALL模式,否则
.会匹配换行符,导致正则跨多个START-END组匹配
内容的提问来源于stack exchange,提问作者Yoi2hot4ya
相关产品推荐
相关产品推荐

