我需要一個捕獲組,它將返回我inner1:
和inner2:
之間的大括號,但outter:
。在大括號內捕獲組
outter: value
{ inner1: value, inner2: value, ... }
我試過這個; \{.*?(\w*\:).*\}
我只拿到第一個inner1:
。我應該使用什麼樣的模式才能在花括號之間返回其餘的組?
我需要一個捕獲組,它將返回我inner1:
和inner2:
之間的大括號,但outter:
。在大括號內捕獲組
outter: value
{ inner1: value, inner2: value, ... }
我試過這個; \{.*?(\w*\:).*\}
我只拿到第一個inner1:
。我應該使用什麼樣的模式才能在花括號之間返回其餘的組?
這看起來像JSON語法。爲什麼不把它序列化成JSON對象或字典並根據鍵提取?
這似乎捕捉inner1:
和inner2:
^\{\s*(?:(\w+:)\s*\w+\s*,?\s*)+\s*\}$
編輯:略有變化,它顯示了當我用快報,以測試它,它抓住了值。
乍一看,我認爲它會起作用,但顯然它只是捕獲最後一個,'inner2',如果我沒有弄錯的話。 –
更新後,我還使用Expresso進行測試,並捕獲兩者。它是相同的匹配項,但它應包含多個值。你在使用哪種語言? – CaffGeek
它是Python,但現在它並不捕獲任何組,儘管它感覺正確。 –
如果你的數據是格式良好的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*([^:]++)/)
它看起來像JS ON但它不是,我需要一個硬編碼的正則表達式,因爲我沒有這樣的選項,例如將這些代碼序列化成JSON對象。 –