2014-10-03 94 views
1

我需要在長JSON字符串中的特定節點內提取一個節點值。正則表達式匹配json節點

即人節點描述節點:

」:{「 時代」: 「10」, 「描述 」:「 例如」,工作:{ 「稱號」:」銷售」,‘工資’:‘$ 3000’},‘性’:‘男’}

作爲使用JSON庫反序列化浪費了太多的時間很長的JSON字符串,我用Google搜索,發現了一個正則表達式匹配一個JSON節點值並且大部分時間都工作得快(幾毫秒)

Regex regex = new Regex("\"person\":{(?:[^{}]|(?<open>{)|(?<-open>}))*\"description\":\"(.*?)\"(?:.*?)(?(open)(?!))}"); 

工程進展緩慢(用一整秒)時,重複的節點名稱在一些內部節點存在匹配發生未知原因後:

「人」:{「時代」:「10 「,」description「:」example「,job:{」title「:」sales「,」salary「:」$ 3000「,」description「:」example「},」sex「:」male「}

我想提高這個正則表達式的效率,以便它只會檢查該人的最外層內容節點(粗體):

「人」:{「時代」: 「10」, 「說明」: 「例如」,工作:{ 「稱號」: 「銷售」, 「工資」:」 $ 3000" , 「說明」: 「例如」},「性」: 「男」}

我是新來的正則表達式,此正則表達式可能不適合我的情況。
有什麼想法?

+1

它應該更容易(可能更快)只解析JSON和拉你想要的值。參考。到[System.Web.Helpers.Json](http://msdn.microsoft.com/en-us/library/system.web.helpers.json%28v=vs.111%29.aspx) – wdosanjos 2014-10-03 12:22:16

+0

什麼時候desciption包含引號像「」description「:」example \「blah \」「' – Toto 2014-10-03 12:22:18

+0

你想提取什麼? – 2014-10-03 12:24:49

回答

1

此正則表達式應該適用於你的情況和更快:

"person"\s*:\s*\{(?: 
    (?(open)(?!)|(?>"description"\s*:\s*"(?<description>(?:\\.|(?>[^\\"]+))*)")) 
    |(?>[^{}"]+) 
    |(?>(?:"(?:\\.|(?>[^\\"]+))*")) 
    |(?<open>\{) 
    |(?<-open>\}) 
)*? 
(?(open)(?!)) 
(?(description)|(?!)) 

DEMO

IgnorePatternWhitespace使用它。它也會妥善處理轉義報價(\")。您的描述將在description命名組中。

它應該更快,因爲我在幾個地方使用了原子組((?>...)),在這些地方我知道回溯是無用的,並且我一旦發現它想要的描述就立即停止掃描文本。

哦,你應該使用正則表達式逐字字符串,所以你不必什麼都逃不過:

var regex = new Regex(@".....") 
+0

在我的理解中,這不會捕獲「作業」葉子後面的屬性,在OP的示例中「sex」:「male」。 – funkwurm 2014-10-03 13:43:50

+0

@funkwurm提問者只需要'description'節點,所以我的正則表達式在捕獲它時立即停止 – 2014-10-03 13:45:19

+0

是的,我只需要一個節點,而且這個正則表達式在每種情況下的工作都非常好,並且比我使用的正則表達式更快!我希望我能像你一樣構建這種複雜但高效的正則表達式。非常感謝! – 2014-10-03 14:05:23