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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:12:50