0

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

  • 预期返回部分是匹配的行,后跟/^[ \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
4

1 回答 1

1

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

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

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

在这里测试:http ://rubular.com/r/ZYjqPQND28

您的与正则表达式有关的定义有一点问题/[ \t]*#(?!>\{)/,我假设您的意思是/[ \t]*#(?!=>)/,否则

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

将算作一大块

另一种方法是使用这个正则表达式(完全未优化):

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

简单地将其正确拆分为块,然后对每个块进行相对简单的正则表达式测试,以查看它是预期回报还是主要部分。

于 2012-10-28T08:31:09.517 回答