如何用正则提取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
相关产品推荐
相关产品推荐

