2013-07-18 52 views
1

我正在想出一個正則表達式,它允許我解析冒號分隔的令牌,格式爲鍵和值對。使用正則表達式解析令牌

[/foo:bar] // where [key:value] 

棘手的部分是令牌值可以包含另一個令牌。

[/foo:[/foo:bar]] 

在上面的例子中,我想匹配foo作爲鍵和[/ foo:bar]作爲值。以下表達式的工作原理如下:

^\[/([^:]+):(.*)\]+$ 

但是,當字符串有多個標記時,這不起作用。例如:

[/foo:[/foo:bar]][/foo:bar] // results in foo and [/GetPath:[/GetPath:]]][/foo:bar 

我想我只是稍微離開了,但我不能,爲了我的生活,找出我失蹤的東西。

+2

嵌套的東西是正則表達式匹配一個非常糟糕的事情。它只能通過特定於引擎的特殊操作員才能實現。出於這個原因,通常認爲將自己的快速解析器連接起來要比在單個表達式上花費數天時間來實現它更有效率。 –

+0

請檢查着名的[用正則表達式解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)以獲取關於解析嵌套大括號的建議(嚴重的,只是跳過一次滑稽)...另一方面,找到正確解析XPath表達式的示例可能是更好的方法。 –

+0

正則表達式是每個現代程序員工具包的強制性部分;所以能夠掀起一個微不足道的解析器。我的建議是放棄這個任務的正則表達式,這是他們不適合的,並且練習你的解析器寫作。 –

回答

0

此正則表達式匹配的名稱以嵌套值:

\[/([^:]+):(.*?)\](?=\[|$) 

的變化是提前斷言繼劃定右方括號必須是一個新名詞或輸入結束的字符添加一個樣子。

按本live demo on rubular,使用輸入

[/foo:[/foo:bar]][/foo:bar] 

時產生的匹配爲:

Match 1... 
Group 1: foo 
Group 2: [/foo:bar] 
Match 2... 
Group 1: foo 
Group 2: bar