2012-06-11 15 views
0

使用Ruby,我試圖解析一些文檔,我需要拆分文本塊,每個文本塊都有一個標題,並且後面跟着未知長度的文本,然後將它們推送到陣列;通過使用Ruby的標題拆分文本塊

SECTION 1. A HEADING 

Some undetermined length of text, 
which can be multiple lines and paragraphs. 


SECTION 2. ANOTHER HEADING 

Another big block of text. 

應該成爲

["SECTION 1. A HEADING 

Some undetermined length of text, 
which can be multiple lines and paragraphs.", 
"SECTION 2. ANOTHER HEADING 

Another big block of text."] 

我可以只使用string.split(/\n\n\n/),但我想更具體的,因爲我不能保證每個部分都會有後兩個空行的東西。多一點實驗讓我意識到這一點;

string.split(/(?:^|\n)(SECTION.+\n)/).each do |s| 
    sections << s 
end 

,但我不得不再次處理輸出以獲得我所需要的。

有沒有辦法做到這一點,而不必做多次通行證?

感謝您的幫助。

+0

只要看看用線「部分n」,直到找到另一個,繼續建立一個部分字符串。 –

+0

通過RegExes一次一行地抓取文本只是看起來有點太Perlish,我想也許Ruby有一些更簡潔:) –

+0

你可以閱讀任何語言的整個文件文件和玩正則表達式遊戲,IMO我會而只是把它放在一邊,因爲它目前的形式並不是一個有趣的問題。 –

回答

2

您可以使用String#scan具有多模式正則表達式和積極前瞻:

text = <<ENDTEXT 
SECTION 1. A HEADING 

Some undetermined length of text, 
which can be multiple lines and paragraphs. 


SECTION 2. ANOTHER HEADING 

Another big block of text. 
ENDTEXT 

header = /^SECTION\s+\d+\./ 
sections = text.scan(/(?m)#{header}.*?(?=#{header}|\Z)/) 

puts sections.join("\n---\n") 

# => 
SECTION 1. A HEADING 

Some undetermined length of text, 
which can be multiple lines and paragraphs. 



--- 
SECTION 2. ANOTHER HEADING 

Another big block of text. 
+0

我也嘗試過掃描,但沒有預見,這就是魔法! pguardiario的負向預測可以提供更清晰的正則表達式,但是您的重複性會減少一些,尤其是一旦正則表達式的複雜性增加。我很可能將這兩者結合起來。謝謝。 –

1

串#掃描會給你你所要求的數組:

string.scan /^SECTION(?:(?!SECTION).)*/m 
+0

實質上,dbenhur的答案也是一樣,儘管負向前視肯定更清晰。需要在前瞻中添加^,否則如果SECTION位於段落的中間,則會中斷。 –

+0

這似乎不太可能,但隨時編輯我的答案,並添加^。消極的向前看是非常明顯優於imho。 – pguardiario