2012-12-11 66 views
1

我知道如何使用Regex.Split()和Regex.Replace();但更換時如何保留某些數據。匹配並替換字符串中的文本,同時保留非替換文本

如果我有文本字符串中的[]以下行(後每分裂;)

using system; 
using system.blab; 
using system.blab.blabity; 

我將如何循環槽和替換所有的「使用'to'',但是使用(。+;)匹配整行'例如。 並以下列結束(但不只是Regex.replace( 「使用」, 「」);) 「

<using> system; 
<using> system.blab; 
<using> system.blab.blabity; 

+0

是對第一碼塊中的期望的輸入和所述第二碼塊中的期望的輸出正則表達式? –

回答

1

這應該讓你非常接近。您應該爲您嘗試匹配的每個邏輯項目使用一個命名組。在這個例子中,你試圖匹配所有不是字符串「using」的東西。然後,您可以使用記號$ {yourGroupName}來引用替換字符串中的匹配項。我寫了一個名爲RegexPixie的工具,它可以顯示您在輸入內容時是否與您的內容匹配,以便查看哪些內容有效,哪些內容無效。

//the named group has the name "everythingElse" 
var regex = new Regex(@"using(?<everythingElse>[^\r\n]+)"); 
var content = new string [] { /* ... */ }; 

for(int i = 0; i < content[i]; i++) 
{ 
    content[i] = regex.Replace(content[i], "${everythingElse}"); 
} 
+0

在「不結束」部分之後,您是否應該擁有這種缺陷? –

+0

是的。感謝Johny。現在它是固定的。 – viggity

3

如果str是當前的字符串,然後

  string str = @"using system; 
      using system.blab; 
      using system.blab.blabity;"; 
      str = str.Replace("using ", "<using> "); 
+2

這是最簡單的答案,正則表達式的答案稍微難以閱讀,但如果需要的話可以提供更多的答案。 – Davio

+0

感謝Davio。 KISS原理 –

+0

當然,它也會替代在搜索字符串的其他位置使用「'」的隨機文本發生,但我不知道這是否會在實踐中出現問題。一個隨機表達式,例如「int usingInt = 1」將被更改爲「int Int = 1」。 – Davio

2

在正則表達式中使用parens指示引擎將該值存儲爲一個組。那麼當您調用Replace時,可以使用$ n引用組,其中n是組的編號。我沒有測試過這一點,但這樣的事情:

Regex.Replace(input, @"^using(.+;)$", "$1"); 

Read here for more info

+0

這種方法很有效,但我沒有選擇這個答案,因爲上面的那個比較容易閱讀,特別是當你需要保持不同的事物時。 –

0

這結合了2個答案。它包裝word boundaries\b周圍using執行全字搜索,然後捕獲的回參考$1

string str = @"using system; 
using system.blab; 
using system.blab.blabity;"; 

str = Regex.Replace(str, @"\b(using)\b", "<$1>");