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

如何编写正则匹配特定分隔行组,排除含指定字符串的组

匹配不含指定字符串的多行函数体正则方案

你需要的是匹配以func foo开头、}结尾,但中间不包含dontmatchme的多行函数体,核心是用否定前瞻断言结合多行匹配规则实现,解决原有正则无法排除目标内容的问题。

核心正则表达式(PCRE兼容,如PHP、Grep -P)

func foo(?:(?!dontmatchme|}).[\n])*}

规则拆解

  • func foo:精准匹配函数开头标识
  • (?:(?!dontmatchme|}).[\n])*:非捕获循环组,逐个匹配字符(含换行),但每一步都会检查:当前位置后既不是dontmatchme的起始,也不是结束的},确保中间不会出现要排除的字符串
  • }:匹配函数结尾的闭合大括号

Python 环境适配示例

Python 的 re 模块需要开启 re.DOTALL 标志(让.匹配换行符),代码如下:

import re

pattern = r'func foo(?:(?!dontmatchme|}).)*}'
target_text = """
func foo1() {
    let x = 1;
    dontmatchme
    return x;
}

func foo2() {
    let y = 2;
    return y;
}
"""

# 只提取不含dontmatchme的foo函数体
valid_matches = re.findall(pattern, target_text, re.DOTALL)
print(valid_matches)

原有正则的问题

你之前用的func foo.*(\n|.)*?(})采用非贪婪匹配,但仅能从第一个func foo匹配到最近的},无法对中间内容做排除检查,因此会误匹配包含dontmatchme的函数。

注意事项

  • 如果函数体存在嵌套大括号(比如内部代码块),上述正则会因匹配到第一个}而提前终止,这种场景需要递归正则(不同语言支持度有差异)
  • JavaScript 环境需开启s(dotAll)标志,正则写法为:/func foo(?:(?!dontmatchme|}).)*}/s

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:09:24