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

如何用正则匹配N行内先后出现的两个代码语句?

用正则匹配特定if语句后30行内的test.check()

需求说明

我需要在代码库中找到满足以下条件的代码片段:

  • 存在作为控制门的if global_var:语句
  • 该语句后的30行范围内出现test.check()函数

匹配示例

if global_var:
   fizz()
   test.buzz()
   test.check()
   bang()
   bop()

不匹配示例

  1. 无目标控制门的情况:
fizz()
test.buzz()
test.check()
bang()
bop()
  1. 有控制门但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\(\):匹配目标函数,.和()是正则特殊字符,必须用\转义

不同场景适配

  1. GitHub代码搜索:需要在正则前加regex:前缀,确保开启正则搜索:
    regex:if global_var:\n(?:.*\n){0,30}test\.check\(\)
    
  2. 兼容Windows换行:如果代码用\r\n换行,可将\n替换为\r?\n:
    if global_var:\r?\n(?:.*\r?\n){0,30}test\.check\(\)
    
  3. 严格匹配缩进(可选):如果要求test.check()必须在if的代码块内(比如4空格缩进),可调整正则:
    if global_var:\n(?: {4}.*\n){0,30} {4}test\.check\(\)
    
    注:此版本仅匹配缩进符合要求的代码块,适合代码风格统一的项目

关键注意点

  • 必须开启搜索工具的多行匹配模式(比如VS Code搜索栏中点击换行图标,或勾选"多行"选项),否则正则无法跨换行匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:20:00