2013-06-02 30 views
1

我用遞歸Perl的正則REG-表達式來掃描嵌套singlechar括號:的Perl的正則表達式multichar嵌套支架

$RE =  qr'(?:[\(]((?:(?>[^\(\)]+)|(??{$RE}))*)[\)])'; 

這讓我掃描C函數的調用,這樣的:

"func (a(b()))" ~= /$RE/ 

匹配「(a(b()))」。現在,我想解析帕斯卡爾風格嵌套[如果,如果端]括號,即:

if (a) then 
    if (b) then 
    blaif := 1; 
    else 
    blaend := 2; 
    end if; 
end if; 

我試圖$ RE重寫從上面到:

$RE_if = qr'(?:(?:if)((?:(?>(?!(?:\bif\b|\bend\s+if))+)|(??{$RE_if}))*)\ 
(?:\bend\s+if))'; 

但kindof行不通。有人有正則表達式處理multichar括號 like [「if」,「end if」]?

- 問候康拉德

+0

'(?!...)+'沒有任何意義。如果'(?!(?:\ bif \ b | \ bend \ s + if))+'be'(?:(!!\ bif \ b | \ bend \ s + if)。 – ikegami

回答

1

讓我們來看看原來的模式:(外來逃逸刪除(?:)刪除不用周圍。)

[(]     # Prefix. 
(
    (?: (?> [^()] +) # Some characters containing neither prefix nor suffix. 
    | (??{ $RE }) # Recursion 
    )* 
) 
[)]     # Suffix. 

(?:(?!STRING).)*STRING[^CHAR]*CHAR,所以:

\bif\b 
(
    (?: (?> (?:(?! \b(?:end\s+)?if\b).)+) 
    | (??{ $RE }) 
    )* 
) 
\bend\s+if\b 

順便說一下,(?>PAT+)可以寫成PAT++

+0

+1,我推薦使用'(?R)'而不是'(?? {$ RE})'tho。 – Qtax

+0

@Qtax的確,「(?R)」更有效率。但是,不能分辨它是否正確,因爲我們沒有顯示'$ RE'是如何使用的。定義一個模式可能會更好。 – ikegami

+0

謝謝!這個表達似乎工作。 –