2016-09-19 33 views
1

我需要搜索文本字符串中所有出現的鏈式C#類函數。例如,我想破了每種方法和字符串的括號內的參數,如這樣的:C#正則表達式搜索虛線函數及其參數

object.method(1, "2", abc).method2().method3("test(), 1, 2, 3").method4("\"Hi\"") 

這裏是正則表達式我幾乎有工作:

(?<objectName>[^\}]*?)\.(?<methodName>[^\}]*?)\(((?:[^;"']|"[^"]*"|'[^']*')+)*?\) 

這提取對象名與第一方法名正確,但腫塊

1, 「2」,ABC).method2()。方法3( 「試驗,1,2,3」)。方法4( 「\」 您好\ 「」

全部以第三個參數表示爲「$ 1」。

我最近的做法是通過移除objectName規範來劃分和征服,因爲這很容易解析出來。這導致我使用:

\.(?<methodName>[^(]*?)\(((?:[^;"']|"[^"]*"|'[^']*')+)*?\) 

它產生與以前顯然沒有objectName類似的結果。我這樣做是爲了看看我能得到一個全局結果,但可以得到正確的正則表達式語法。總之,我需要將多個鏈接的.method(參數)事件解析爲其名爲「methodName」和「parameters」的組成部分。我推導出了一些東西,但我的正則表達式技巧充其量是生鏽的,現在無法克服這一點。我感謝您可能提供的任何幫助。

我一直在使用這個網站來進行測試:http://regexstorm.net/tester

UPDATE:澄清,要求不包括支持C#lambda表達式,只有虛函數的語法。這不是一個完整的C#解析器。唯一需要的是虛線方法鏈接。我對任何混淆抱歉。我一直在尋找突圍的模式是:

object.method(arguments).method(arguments).method(arguments)... 

我的這種做法是先提取對象的名字是一個簡單的操作,不需要使用正則表達式。現在,這將留下以下的正則表達式解析爲兩個組成部分:

.method(arguments).method(arguments).method(arguments)... 

這將產生:

method arguments 
method arguments 
method arguments 
... 

參數可空(缺失),如。方法(),或方法實際上可以是一個屬性(沒有括號和參數),如:

.method.method().method(arguments) 

這將產生:

method (null) 
method (string.Empty) 
method arguments 

參數將包含開啓和關閉括號之間的所有內容;這些不需要在此時解析出來,因爲這些將在隨後的正則表達式操作中處理。

在我看來,這似乎是在正則表達式能夠檢測這種簡單模式的dot-method-openPar-argumentsStr-closePar下一個dot-method-openPar-argumentsStr-closePar等等。

這是語法的程度 - 沒有意見,沒有拉姆達 - 剛剛的object.method(參數)。方法()...

我希望這有助於。

+0

Every()按照「(」)的順序創建一個組,你試過用「$ 2」或「$ 3」等更高的$來查看它們是否包含他們期望的輸出嗎? –

+0

Your hope will崩潰n我向你介紹這個鏈:'method1(「).ToString()」)。method2(1).method3(「)。Fail()」)' – eocron

+0

我回答了一個非常類似的問題(http:// stackoverflow .com/a/37314847/2729609)。正則表達式將會非常大。 –

回答

1

這不能通過正則表達式來正確完成,因爲你的參數太不可預測,並且正則表達式語法級別與C#解析器語法無法相比。例如,它可以包含字符串的任何內容:

method1("x.hiThere().lol()").method2() 

它可以嵌套:

method1(x=>method2().method3()) 

它可以只是這樣做:

a("b().c()",d=> d(").hi()")) 

對你的問題的解決方案,你需要學習約爲Grammars,併爲此特定任務編寫C#語法。在框架方面,您可以從ANTLR項目開始。

說明

的原因,因爲你不能做到這一點是語法類型的差異。 正則表達式使用常規語言,並且在Chomsky層次結構中是Type-3。 C#使用上下文無關語言,並且在Chomsky層次結構中爲Type-2

如果你所說的那樣visualy,C#是更強大的語言不是正則表達式語言:

enter image description here

例如,你的情況下落入坑解析器的是隻是因爲拉姆達在C#:

method1(x=> 
{ 
    .... 
    /* some code here */ 
    .... 
}).method2() 
+0

我跟你說,這不應該使用正則表達式解決,但發佈的問題能夠[處理](http://stackoverflow.com/a/37314847/2729609)。 –

+0

我創建這個答案的情況是最基本的。正則表達式語法是Type-3語法(Regular),另一方面是C#語法 - Type-2語法(Context-free)。這意味着總有些情況下,正則表達式語法不能表示C#語法。 – eocron

+0

謝謝@ ecron06。關於解析科學的絕佳信息。我已更新原始帖子以限制問題的範圍。 C#參考僅用於說明問題的框架。我很欣賞你的答案。 – jmullis