将代码块(字符串)分成“主要部分”及其“预期返回部分”的最佳方法是什么?以下是我的定义:
/^[ \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
答案 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)*)
简单地将它分成正确的块,然后对每个块进行相对简单的正则表达式测试,看它是否是预期的返回或主要部分。