将代码块分成主要部分和预期的返回部分

时间:2012-10-28 08:18:18

标签: ruby regex string

将代码块(字符串)分成“主要部分”及其“预期返回部分”的最佳方法是什么?以下是我的定义:

  • 预期返回部分是一行匹配/^[ \t]*#[ \t]*=>/后跟零个或多个不匹配/^[ \t]*#[ \t]*=>/但匹配/[ \t]*#(?!\{)/的连续行。
  • 主要部分是任何不是预期回报部分的连续行。

主要部件和预期的返回部件可能会在代码块中多次出现。

给定一串代码块,我想得到一个数组数组,每个数组都包含一个标志,表明它是否是一个预期的返回部分,以及字符串。做这个的最好方式是什么?例如,给定一个字符串code,其内容为:

def foo bar
  "hello" if bar
end
#=> foo(true) == "hello"
#=> foo(false) == nil
a = (0..3).to_a
#=> a == [
#          0,
#          1,
#          2,
#          3
#   ]

我想要一个等同于此的回报:

[[false, <<CHUNK1], [true <<CHUNK2], [true, <<CHUNK3], [false, <<CHUNK4], [true, <<CHUNK5]]
def foo bar
  "hello" if bar
end
CHUNK1
#=> foo(true) == "hello"
CHUNK2
#=> foo(false) == nil
CHUNK3
a = (0..3).to_a
CHUNK4
#=> a == [
#          0,
#          1,
#          2,
#          3
#   ]
CHUNK5

1 个答案:

答案 0 :(得分:1)

此正则表达式应匹配所有预期的回报:

^([ \t]*#[ \t]*=>.+(?:\n[ \t]*#(?![ \t]*=>).+)*)

使用分隔符提取并替换字符串中所有预期的返回值。然后用分隔符分割你的字符串,你将拥有所有主要部分。

在此测试:http://rubular.com/r/ZYjqPQND28

关于正则表达式/[ \t]*#(?!>\{)/的定义存在轻微问题,我假设您的意思是/[ \t]*#(?!=>)/,否则

#=> foo(true) == "hello"
#=> foo(false) == nil

将算作一个块

另一种方法是使用此regex(完全未经优化):

^([ \t]*#[ \t]*=>.+(?:\n[ \t]*#(?![ \t]*=>).+)*|(?:[ \t]*(?!#[ \t]*=>).+\n)*)

简单地将它分成正确的块,然后对每个块进行相对简单的正则表达式测试,看它是否是预期的返回或主要部分。

相关问题