2013-08-29 61 views
0

我正在使用以下正則表達式模式來匹配用C#樣式編寫的if語句;正則表達式模式匹配if語句在C#中?

\b[if]{2}\b[ ]?\({1}(?<HeaderSection>[ \w\s\a\t\=\.\@\#\$\%\&a-zA-Z0-9\(\)\;\/\"\'\[\]\*]*)\){1}(?<CommentSection>[\s\a\w\t a-zA-Z0-9\/\.]*)[\r\n]*\{{1}(?<FunctionBody>[\r\n \a\s\wa-zA-Z0-9\(\)\"\.\;\:]*)[\r\n]*\}{1} 

它是一個瘋狂的長正則表達式模式,但似乎工作的一些extent.Let我解釋一下,它有三個命名捕獲組即HeaderSectionCommentSection函數體 .HeaderSection捕捉之間的匹配開始和結束if語句的括號,例如來自以下聲明;

if(Value1==Function(int Z)) 

它捕獲;

Value1==Function(int Z) 

同樣CommentSection捕獲關閉括號後的評論(如果有),所以從下面的語句;

if(Value1==Function(int Z))//This is a Comment. 

它捕獲

//This is a Comment. 

和函數體捕獲任何之間{和},如在下面的代碼;

if(Value1==Function(int Z))//This is a Comment. 
{ 
    This is the 
    space for 
    function body. 
} 

它捕獲「這是功能體的空間。」 所以這就是正則表達式匹配的解釋。現在的問題是,如果我有這樣的功能;

if(Value1==Function(int Z)//This is a Comment. 
{ 
    if(Value2==Value1) 
    { 
    Some code 
    } 
} 

如果我使用上面的正則表達式匹配它,它不匹配第一個if聲明即;

if(Value1==Function(int Z)//This is a Comment. 
{ 
Another function(); 
} 

,而是相匹配的內部一個即

if(Value2==Value1) 
    { 
    Some code 
    } 

請點我做錯了,或是否有另一種方式,是不太凌亂,請讓我知道,或糾正,如果正則表達式模式它的錯誤somewhere.One事情我在C#中使用正則表達式函數做這一切。 在此先感謝。

+8

我沒有足夠的手指在什麼錯在這裏點。你爲什麼想用正則表達式來做這件事?在所有? –

+0

不,我不想使用正則表達式,但我找不到其他的方式,所以我不得不使用它們。 – PurpleXenon

+0

古老的日子http://dinosaur.compilertools.net/ – I4V

回答

1
(?<header>if\(.*?)(?<comment>//.*?)*\s\n\{(?<functionbody>.*?)\n\} 

這似乎是一個解決方案,如果paran是以所謂的方式形成的。

(?<header>if\(.*?) 

將匹配if(其次是什麼,但//部分之前,所以它會匹配

if(Value1==Function(int Z))

然後將其移動到下(?<comment>//.*?)*\s將繼//符號匹配任何東西,但也會*等於零或多個出現,\s確保它不超出行末。

然後(\n\{)(?<functionbody>.*?)(\n\})匹配換行符後面的任何{,直到在換行符後面找到}

var x = 0 
if(Value1==Function(int Z))//This is a Comment. 
{ 
    if(Value2==Value1) 
    { 
    Some code 
    } 
} 
var y = 0 

if(y == x) 
{ 
    x = y + 1 
} 

它將匹配以下組:

header: if(Value1==Function(int Z)) 
comment: //This is a Comment. 
functionbody: 
    if(Value2==Value1) 
    { 
    Some code 
    } 

header: if(y == x) 
functionbody: 
     x = y + 1