2011-02-09 65 views
1

我想寫一個正則表達式匹配Ruby的列表和哈希語法,如:正則表達式來檢查多維數組語法

[:a, "b", c, 3] 

{:a => [ 
    1,2,3 
]} 

[1, { 
    a => "t", :b => "w", 
    :c => :o 
}, 3] 

的問題,當然,是嵌套/遞歸特性的東西。我懷疑這種嵌套結構實際上不能表達爲正則表達式,因爲'語言'不是常規的。我期望解決方案必須涉及子程序和遞歸,但是我正在努力想方設法解決它。任何人都可以確認/否認我的懷疑或提供解決方案嗎?

任何幫助表示讚賞。

編輯:作注,我使用PHP的preg_*方法主要

編輯:作爲另一個音符,我創建了一個程序,<ruby_value>匹配鍵和標量值。

編輯:我應該說明我對這個「出於興趣」更感興趣。我已經在PHP中爲這些東西寫了一個迷你分析器,但是我有興趣看看是否存在一個不必要的純正規表達式解決方案。

E.g.等於嵌套括號:

/^(?<paren_expr> 
    \((?: (?&paren_expr) |) \) 
)$/x 

這是一個有效的PHP正則表達式和匹配 「(())」, 「()」 和 「((((((()))))))」,而不是「(」或「(()」等

+1

你是對的。正則表達式不適用於遞歸結構。 – 2011-02-09 01:21:53

+0

我有種回答我自己的問題在這裏...激勵解決方案是[這個SO解決方案](http://stackoverflow.com/questions/764247/why-are-regular-expressions-so-controversial/4053506#4053506 ) – connec 2011-02-09 02:02:18

回答

0

你是正確的,嵌套的結構是不是一個正規的語言,因而無法通過單純的正則表達式來表示。

PCRE必須指定遞歸正則表達式的能力,儘管我不確定PHP的實現是否包含這種支持。

真的,儘管如此,你想要做的是寫一個狀態機自己(嵌套內存)。

1

正確,它不規則,所以你不能用1個常規的非遞歸表達式來匹配它。

但是,您可以製作一個循環,替換每一個匹配,直到沒有更多可用匹配爲止。

所以......

[[[ foo ]]] 

[[PLACEHOLDER_001]] 

[PLACEHOLDER_002] 

PLACEHOLDER_003 

這樣,你可以把它不會有問題的工作。不能說這是一個非常漂亮的解決方案。基於堆棧的解決方案會更好。