2017-07-27 65 views
-2

我有一個麻煩得到一個表達式的工作,以取代一個函數的全部內容。例如C#正則表達式來替換整個函數的內容

void function1 (void) 
{ 
    Some junk here(); 
    Other Junk here 
    { 
     Blah blah blah 
    } 
} 

我想用一些預定義的值來代替這個函數的內容即

void function1 (void) 
{ 
    Something else here 
} 

這是我目前不過它似乎並沒有工作。我試圖捕捉函數的第一部分,然後捕捉單獨在新行上的結束大括號。我是很新,正則表達式所以請原諒我,如果它是沒有意義

text = Regex.Replace(text, @"(function1)*?(^}$))", Replace, RegexOptions.Multiline); 

任何想法,我做錯了或我應該如何去了解這個不同?

+1

爲什麼不只是做與代碼,你想 –

+0

一個新的功能,你是什麼意思時,你說「它似乎不工作?」它不能匹配任何東西嗎?還是它匹配錯誤的東西?或者是更換錯誤? (我認爲'Replace'是一種某種類型的字符串?它是否包含反向引用,或者爲什麼要捕獲函數名稱並關閉大括號?) – smarx

+1

您需要X.您認爲「正則表達式替換整個函數的內容」會讓你X,但它沒有。 [直到你告訴我們X是什麼,我們纔會有幫助](https://meta.stackexchange.com/questions/66377/)。 –

回答

-2

這似乎工作:

/function1(?:.|\n)*?^}/m 

http://regexr.com/3geoq

我認爲您的正則表達式的主要問題是(function1)*,它與字符串"function1"零次或多次匹配。示例匹配字符串是"""function1function1function1"。你的意思可能是(function1).*,但除非在.NET的正則表達式引擎中工作方式不同,否則.將不匹配換行符。我使用(?:.|\n)來代替換行符。我也放棄了捕獲,因爲你對我關於後向引用的問題的迴應似乎並未表明你實際上在使用它們。

您的正則表達式中還有一個額外的右括號,我預料會導致錯誤。

全部工作的C#代碼:

using System; 
using System.Text.RegularExpressions; 

namespace regex 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var text = @"something up here 
void anotherfunc(int x) 
{ 

} 

void function1 (void) 
{ 
    Some junk here(); 
    Other Junk here 
    { 
     Blah blah blah 
    } 
} 

int main() 
{ 
}"; 

      var replacement = @"function1 (void) 
    Something else here 
}"; 

      Console.Out.WriteLine(Regex.Replace(text, @"function1(?:.|\n)*?^}", replacement, RegexOptions.Multiline)); 
     } 
    } 
} 

輸出:

something up here 
void anotherfunc(int x) 
{ 

} 

void function1 (void) 
    Something else here 
} 

int main() 
{ 
} 
+0

我得到了一個downvote,但我不知道爲什麼。如果downvoter在這裏,對什麼可以改進的解釋將非常感謝! – smarx

+0

謝謝,這工作得很好。我很高興你解釋它,它絕對有幫助。我不知道爲什麼我需要刪除$,但它不會與它匹配。 \ n會抓住所有新的線路嗎?它適用於我,但我已經讀過,在Windows中,換行符標記爲\ r \ n而不是\ n – Kbatryn

+0

我相信'.'會安全地匹配'\ r',所以'(?:。| \ n )'仍然應該涵蓋一切。 – smarx

0

這是我想出了。請讓我知道這對你有沒有用。

public static string Replace_Function_Contents(string old_function, string new_contents) 
    { 
     Regex function_match = new Regex(@"(\s){1,}?([\s\w]{1,})?(\s{1,})?\(.{1,}?\)(\s{1,}){"); 
     var match = function_match.Match(old_function); 
     return old_function.Remove(match.Index + match.Length) + new_contents + "}"; 
    } 
+0

需要注意的是,這需要將整個函數作爲輸入,並替換其內容。不知道這是否正是你需要的。 – lunarquaker

+0

我的問題是,輸入是一個完整的代碼文件,他們只想替換某個函數。另外,你能解釋你的正則表達嗎?我發現很難遵循,而不是'{1,''與'+'相同的東西?我也不確定'{1,}?'的目的是什麼......我想這與'*'是一樣的。這裏也有很多捕獲,但我不知道爲什麼,因爲它們似乎沒有被使用。 – smarx

+0

是的,不幸的是我不知道最初的整個功能是什麼,所以我不知道我會如何採用這個。我對正則表達式很陌生,所以你介意解釋你的表達式是如何工作的?謝謝 – Kbatryn