2015-04-17 59 views
0

我正在努力將文本從文件解析到哈希中。正則表達式不是我的東西,我試圖更好地理解如何做這樣的事情。來自文本和括號的正則表達式鍵值

-some- 
key1=value1 
key2=value2 

key3=value3 

; comment 
-something- 
key4=value4 
key5=value5 

結果應該是這樣的

some.key1 = value1 
some.key2 = value2 
some.key3 = value3 
something.key4 = value4 
something.key5 = value5 

我在Ruby的工作,我能捕捉到什麼破折號但雙換行符之間,和評論都扔我送行。目前我有類似這樣的東西,它可以找到破折號中的內容並將其放入組1中,然後填入組2中的下一行,但隨後停在那裏。

data = Hash[text.scan(/^\-(.*?)\-\s(.*?)$/m)] 

任何幫助理解這將如何工作是非常感謝。

更新:通過兩種不同的正則表達式和一個循環來實現它。

但是必須有更高效的方法,對吧?

data = Hash.new 
Hash[text.scan(/\-(.*?)\-\s([^\r\n]*(?:[\r\n]+(?!\-).*)*)/)].each do |key, value| 
    data[key] = Hash[value.scan(/(?<=\s|\A)([^\s=]+)\s*=\s*(.*?)(?=(?:\s[^\s=]+=|$))/m)] 
end 

puts data.inspect 
+0

您可以發佈您的解決方案並接受它。 –

回答

0

你可以這樣說:

text = "-some- 
key1=value1 
key2=value2 

key3=value3 

; comment 
-something- 
key4=value4 
key5=value5" 

data = Hash[text.scan(/(\w+)=(\w+)/)] 

puts data 

輸出:

{"key1"=>"value1", "key2"=>"value2", "key3"=>"value3", "key4"=>"value4", "key5"=>"value5"}  

(\w+)將捕獲的=兩側1個或多個字母數字符號,我們並不需要一個多行模式選項,除非你有除數字,字母和_以外的特殊字符。

+0

似乎沒有拿起破折號之間的東西。 –

+0

啊,我明白你的意思了,讓我想一下 –