如何编写正则匹配特定分隔行组,排除含指定字符串的组
匹配不含指定字符串的多行函数体正则方案
你需要的是匹配以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
相关产品推荐
相关产品推荐

