2012-10-28 25 views
0

將代碼塊(字符串)分解爲其「主要部分」及其「期望返回部分」的最佳方式是什麼?這裏是我的定義:將代碼塊分離爲主要部分和預期返回部分

  • 預期收益部分是一個匹配/^[ \t]*#[ \t]*=>/然後連續零個或多個行不匹配/^[ \t]*#[ \t]*=>/但一致/[ \t]*#(?!\{)/線。
  • A 主要部分是不是預期回報部分的任何連續線。

主要零件和預期退貨零件可能在代碼塊中出現多次。

給定一個代碼塊的字符串,我想獲得一個數組數組,其中每個數組都包含一個是否是預期返回部分的標誌和字符串。做這個的最好方式是什麼?例如,給定一個字符串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

我問了一個與此相關的問題:http://stackoverflow.com/questions/13107492 – sawa

回答

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)*) 

只需簡單地將其拆分爲塊,然後對每個塊執行相對簡單的正則表達式測試,看它是否是預期的返回或主要部分。

+0

如果我在第五行中將'#=>'更改爲'#=>',那麼您的正則表達式無法正常工作。也許我所要求的規範值得商榷。 – sawa

+0

@sawa正確,我剛剛修改了正則表達式後重新讀你的問題。它現在匹配'#=>' –

+0

謝謝,我認爲你的正則表達式現在可以工作。關於匹配'/ [\ t] *#(?!> \ {)/',正如我在問題中所說的那樣,這是一個必要條件;還有另一個條件不符合其他正則表達式。你的正則表達式似乎正確地將它們合併成一個。 – sawa