2014-01-24 66 views
0

我需要一個捕獲組,它將返回我inner1:inner2:之間的大括號,但outter:在大括號內捕獲組

outter: value 
{ inner1: value, inner2: value, ... } 

我試過這個; \{.*?(\w*\:).*\}我只拿到第一個inner1:。我應該使用什麼樣的模式才能在花括號之間返回其餘的組?

回答

1

這看起來像JSON語法。爲什麼不把它序列化成JSON對象或字典並根據鍵提取?

+0

它看起來像JS ON但它不是,我需要一個硬編碼的正則表達式,因爲我沒有這樣的選項,例如將這些代碼序列化成JSON對象。 –

1

這似乎捕捉inner1:inner2:

^\{\s*(?:(\w+:)\s*\w+\s*,?\s*)+\s*\}$ 

編輯:略有變化,它顯示了當我用快報,以測試它,它抓住了值。

+0

乍一看,我認爲它會起作用,但顯然它只是捕獲最後一個,'inner2',如果我沒有弄錯的話。 –

+0

更新後,我還使用Expresso進行測試,並捕獲兩者。它是相同的匹配項,但它應包含多個值。你在使用哪種語言? – CaffGeek

+0

它是Python,但現在它並不捕獲任何組,儘管它感覺正確。 –

0

如果你的數據是格式良好的json,你可以使用json解析器。

另一種方法是使用簡單的模式提取大括號內的所有內容並拆分結果{([^}]++)}

一個完整的regex方式:(有鍵/值的未定義數量的工作)

(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++) 

結果是捕獲組中的1個

圖案細節:

(?>   # atomic group: all that can be before the key 
    {   # literal: { 
    |   # OR 
    \G(?<!\A) # contiguous to a precedent match but not a the start of the string 
    :[^,}]++, # a : followed by all that is not a , or } followed by a , 
)    # close the atomic group 
\s*   # possible spaces 
([^:]++)  # capture group 1: all that is not a : 

示例:

text = <<EOF 
outter: value 
{ inner1: value, inner2: value, inner3: val } 
EOF 

puts text.scan(/(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++)/)