2017-08-06 20 views
1

我有一個字符串,其中包含一串HTML文件的內容,並標示@name消除了與正則表達式尾隨換行符Ruby的「串#掃描」

string = "@one\n\n<html>\n</html>\n\[email protected]\n<html>\n</html>\n\n\n" 

我想兩個元素數組的數組,其每一個與標籤作爲第一個元素和HTML文檔作爲第二的:

[ ["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"] ] 

爲了解決這個問題,我製作以下正則表達式:

regex = /(@.+)\n+([^@]+)\n+/ 

並將其應用於string.scan regex

但是,而不是所希望的輸出,得到以下:

[ ["@one", "<html>\n</html>\n"], ["@two", "<html>\n</html>\n\n"] ] 

有在每個文件的結尾尾隨換行符。看起來,只有一個換行符被從文件中刪除,但其他人留在了這個地方。

如何更改上述正則表達式以便從結果文檔中刪除所有尾隨字符?

+0

嘗試/(。+)\ N +([^ @] +)( ?:\ N +)/ – marvel308

回答

0

原因只有最後\n被扔掉是因爲兩個相關的捕獲部分在正則表達式:.+[^@]+捕捉一切,直到最後\n(爲了使匹配可能的話)。不要緊,他們跟着\n+。請記住,正則表達式從左到右工作。如果某個子字符串(在這種情況下爲\n的序列)可以適用於正則表達式的以下部分的前一部分,它實際上適合於前面的部分。

隨着通用性,我建議這樣做:

string.split(/\s+([email protected])/).map{|s| s.strip.split(/\s+/, 2)} 
# => [["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"]] 
0

你可以先刪除重複的換行符:

string.gsub(/\n+/, "\n").scan(regex) 

=> [["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"]] 
相關問題