我需要搜索文本字符串中所有出現的鏈式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(參數)。方法()...
我希望這有助於。
Every()按照「(」)的順序創建一個組,你試過用「$ 2」或「$ 3」等更高的$來查看它們是否包含他們期望的輸出嗎? –
Your hope will崩潰n我向你介紹這個鏈:'method1(「).ToString()」)。method2(1).method3(「)。Fail()」)' – eocron
我回答了一個非常類似的問題(http:// stackoverflow .com/a/37314847/2729609)。正則表達式將會非常大。 –