如何构建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
相关产品推荐
相关产品推荐

