2010-05-25 145 views
0

內的文本組我有字符串的格式如下:匹配(和替換)的字符串

嗒嗒IIF((doc.PostTypeId == 1),(解析(doc.Id)> 1000), (doc.ParentId> 1000))等等

,我想將其轉換爲:

等等(doc.PostTypeId == 1解析(doc.Id?)> 1000:doc.ParentId> 1000 )等等

到目前爲止,我使用的是下面的正則表達式字符串匹配

IIF\((?<one>[^,]*?),\ (?<two>[^,]*?),\ (?<three>[^,]*)\)

但我有平衡所有的括號的問題,有沒有更好的辦法或正則表達式,這個錯誤的工具?

+0

什麼語言? – 2010-05-25 20:55:46

+0

你絕對不得不擺脫內部括號嗎?如果沒有,看起來你的正則表達式會更簡單。 – John 2010-05-25 20:57:59

+0

@約翰,沒有內部括號可以留下,如果這是更容易。 @Bears,我做它在C#中,但我認爲正則表達式是相當普遍的? – 2010-05-25 21:04:58

回答

1

一般的正則表達式不能處理正確平衡括號,因爲這樣做需要計數的嵌套,這可能是任意深的深度,和正則表達式只能存儲狀態的有限的(一般來說) 。

這就是說,我會假設你正在做的改變並不比,比如說,三個或四個深嵌套更深入的括號 - 在這種情況下,它成爲可能。以下是如何建立起來:

很容易搭配,在所有不帶括號的序列:

EXPR0: [^()]* 

我們可以用它來建立符合括號中有一個非嵌套表達正則表達式:

PAREN1: \(EXPR0\) 

表達式最多包含一個括號?好吧,這只是一個非括號字符PAREN1s的混合物

EXPR1: (?:PAREN1|EXPR0)* 

鑑於此,我們當然可以匹配括號中的均衡表達與嵌套高達一層:

PAREN2: \(EXPR1\) 

這我們可以延伸到匹配任何均衡的表達與不超過兩個級別()中相同的方式

EXPR2: (?:PAREN2|EXPR0)* 

等:

PAREN3: \(EXPR2\) 
EXPR3:  (?:PAREN3|EXPR0) 
PAREN4: \(EXPR3\) 
... 

然後可以使用這個來構建你的對手想要做的更換 - 沿着線的東西:

IIF\(?<one>EXPR5),(?<two>EXPR5),(?<three>EXPR5)\) 

(實際上你需要調整的東西,這樣的EXPR5表達式唐「T匹配unparenthesised逗號,但應足夠清楚該怎麼做,我希望:)

當然,你必須寫一個短的一次性程序來生成所需的重而不是手動構建它!

+0

我很欣賞的深入的答案,我希望我可以給你更多的+1爲你付出努力! – 2010-05-27 09:52:32