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

如何构建Ruby正则表达式提取foo方法的参数至首个方法起始处?

解决Ruby多行代码中提取方法参数的问题

首先,你的需求是精准捕获foo之后到第一个符合/^\s{2}\w+/模式的行之间的所有内容,核心是要让正则在跨行匹配时,能准确停在下一个方法定义的起始位置,而不是贪婪地吃到最后。你之前尝试的正则问题主要在于:要么贪婪匹配会包含后面的bar相关内容,要么没有正确锚定终止的边界。这里推荐两种可行的方案:

方案一:使用正向预查的正则表达式

这个正则会用非贪婪匹配加上正向预查断言,精准定位终止位置:

match_result = code.match(/foo\s+(.*?)(?=\n\s{2}\w+)/m)
puts match_result[1] if match_result

正则各部分解释:

  • foo\s+:匹配foo关键字,以及后面的一个或多个空白字符(包括换行)
  • (.*?):非贪婪模式匹配任意字符,/m修饰符让.可以匹配换行符,实现跨行捕获
  • (?=\n\s{2}\w+):正向预查断言,确保后面紧跟的是「换行+两个空格+单词字符」(也就是下一个方法的起始行),这样匹配会在到达这个位置时停止,不会包含后面的内容

执行后会输出你想要的内容:

an arbitrary statement
 that could go on for 
 several lines

方案二:按行分割处理(更易读)

如果正则让你头疼,也可以用更直观的行分割方式,逻辑清晰,容易调整:

lines = code.split("\n")
# 找到包含foo的行的索引
foo_line_index = lines.find_index { |line| line.strip.start_with?('foo') }

if foo_line_index
  extracted_content = []
  # 从foo行的下一行开始遍历
  (foo_line_index + 1...lines.size).each do |index|
    current_line = lines[index]
    # 遇到符合下一个方法起始模式的行就停止
    break if current_line.match?(/^\s{2}\w+/)
    extracted_content << current_line.rstrip # 保留原格式,可根据需求调整strip
  end
  puts extracted_content.join("\n")
end

这种方法的优势是逻辑一目了然,后续如果需要调整匹配规则(比如修改缩进数量、方法名规则),修改起来更简单。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:03