如何用正则匹配N行内先后出现的两个代码语句?
用正则匹配特定if语句后30行内的
test.check() 需求说明
我需要在代码库中找到满足以下条件的代码片段:
- 存在作为控制门的
if global_var:语句 - 该语句后的30行范围内出现
test.check()函数
匹配示例
if global_var: fizz() test.buzz() test.check() bang() bop()
不匹配示例
- 无目标控制门的情况:
fizz() test.buzz() test.check() bang() bop()
- 有控制门但30行内无目标函数的情况:
if global_var: fizz() test.buzz() bang() bop()
正则实现方案
可以用正则满足需求,以下是通用示例及说明:
基础正则表达式(支持多行匹配)
if global_var:\n(?:.*\n){0,30}test\.check\(\)
正则各部分解释
if global_var:\n:精准匹配目标控制门语句,确保以换行结尾,避免匹配类似if global_var == 1:的变体(?:.*\n){0,30}:匹配0到30行任意内容。其中(?:...)是非捕获组(不产生多余分组结果),.*匹配行内任意字符,\n匹配换行;{0,30}限制行数范围test\.check\(\):匹配目标函数,.和()是正则特殊字符,必须用\转义
不同场景适配
- GitHub代码搜索:需要在正则前加
regex:前缀,确保开启正则搜索:regex:if global_var:\n(?:.*\n){0,30}test\.check\(\) - 兼容Windows换行:如果代码用
\r\n换行,可将\n替换为\r?\n:if global_var:\r?\n(?:.*\r?\n){0,30}test\.check\(\) - 严格匹配缩进(可选):如果要求
test.check()必须在if的代码块内(比如4空格缩进),可调整正则:
注:此版本仅匹配缩进符合要求的代码块,适合代码风格统一的项目if global_var:\n(?: {4}.*\n){0,30} {4}test\.check\(\)
关键注意点
- 必须开启搜索工具的多行匹配模式(比如VS Code搜索栏中点击换行图标,或勾选"多行"选项),否则正则无法跨换行匹配
内容的提问来源于stack exchange,提问作者Falderol
相关产品推荐
相关产品推荐

