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

如何用正则提取foo与bar间包含four的单行/多行文本

正则匹配:提取foo与bar间包含特定关键词的文本(单行/多行兼容)

问题分析

你当前使用的正则foo[\s\S]*?(four)[\s\S]*?bar存在关键缺陷:当某段foo和bar之间没有关键词four时,惰性匹配的[\s\S]*?会跳过当前的bar,继续向后查找,直到找到包含four的下一组foo-bar区间,导致错误的跨区间匹配。

解决方案

要将匹配范围严格限制在单个foo到最近的bar之间,同时确保这段内容包含four,可以使用带否定前瞻的正则表达式:

foo\s*((?:(?!bar)[\s\S])*four(?:(?!bar)[\s\S])*)\s*bar

正则拆解

  • foo:匹配起始标记
  • \s*:匹配foo与目标文本间可能存在的空白(含换行)
  • (?:(?!bar)[\s\S])*:核心限制逻辑——匹配任意字符(包括换行),但每一步都会检查当前位置不是bar的开头,确保匹配不会跨越到下一个bar区间
  • four:必须包含的关键词
  • \s*:匹配目标文本与bar间的空白
  • bar:匹配结束标记
  • 外层括号()为捕获组,直接提取你需要的目标文本

效果验证

用你提供的示例输入测试:

  • 会精准匹配包含four的两个foo-bar块,提取出中间的目标文本
  • 对于不含four的foo-bar块,正则会直接跳过,不会产生错误匹配

简化版(仅匹配完整区间)

如果不需要单独提取中间文本,只需要匹配完整的foo-内容-bar区间,可以使用:

foo(?:(?!bar)[\s\S])*four(?:(?!bar)[\s\S])*bar

内容的提问来源于stack exchange,提问作者John Brew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:09:24