2010-11-19 106 views
1

我正在編寫代碼格式化程序,我需要一些幫助。我必須找到代碼塊,我想使用正則表達式。我需要的格式的代碼基本上是這樣的:RegEx查找嵌套的代碼塊

KEYWORD name { 
    word 
    word 
    ... 
} 

我能夠找到下手塊{和結束}這個表達式:

[{](.*?)[}] 

但我不知道如何將"KEYWORD name"部分添加到表達式中。兩者都是自定義字符串,可以包含除;{}之外的任何字符。

另一個問題是我的代碼塊可以嵌套。我不知道如何添加該功能。

+0

我不知道你的代碼塊是否可以嵌套,但如果是這樣,你的正則表達式將不起作用。 – Jordi 2010-11-19 09:28:56

+0

哦!你是對的!我還沒有測試過。但它們必須嵌套... – 2010-11-19 09:34:31

+0

只要涉及嵌套(到任意深度),正則表達式就變得很難使用。嚴格地說,嵌套結構不規則,因此不適合與正則表達式匹配。一些現代的正則表達式(例如,PCRE,Perl,.NET)使得遞歸匹配成爲可能,但是Java不在其中。因此,您可能需要爲此作業構建/使用解析器。 – 2010-11-19 10:01:16

回答

3

你可以這樣做:

KEYWORD name {.*?} 

既然你想.匹配換行符,以及你將不得不使用多行模式。

由於兩個KEYWORDname是可以含有除了;,{}任何字符的任意字符串:(?+)

[^;,{}]+\s+[^;,{}]+\s*{.*?} 
+0

是啊!這工作正常! – 2010-11-19 09:33:53

2

\ S + \ S + {(*(+。?)。? )}

這是:任何不是空格,後跟一個或多個空白字符,後面跟着不是空格的東西,一個或多個空白字符和您的代碼塊。

如果關鍵字只能包含大寫字母和name,假設所有的字母,數字和下劃線,它應該是這樣的:

([A-Z]+?)\s+([A-Za-z0-9_+?)\s+\{(.*?)\} 

請注意,如果你的代碼塊可以被嵌套,你」會有這個正則表達式的問題,因爲它會匹配第一個{以及第一個}。

+0

謝謝,它的工作原理。但塊有時嵌套。我想用正則表達式讓它快速完成...... :-( – 2010-11-19 09:38:19