2011-06-16 20 views
1

當我在XML配置文件中編寫分隔符值時,會遇到這個問題,通常當您在XML配置中編寫像"\t"這樣的字符串時,解析器類如XDocument會自動將其轉換爲@"\\t",以便獲得反斜槓和't'從配置中解析出來的字符串。但是,我想要的只是一個製表符而不是兩個字符的字符串。如何在運行時值中使用.NET風格的轉義序列?

所以問題變成:給定一個包含像"\t"這樣的轉義序列的字符串,如何將其轉換爲單字符選項卡?

+0

我不明白你在問什麼。由於這些是編譯時文字,顯然沒有這樣做的程序化方式(缺少編寫掃描代碼或實用程序的實用程序)。您是否在尋找Visual Studio插件? – 2011-06-16 21:15:41

+0

我在找的實際上是一種在XML配置中編寫tab char的方法,並將其從我的程序中讀取爲char變量。 – axings 2011-06-16 21:23:33

+0

所以你想在運行時用字符串字符替換字符串中任何'\ t'序列?但是這與字符串文字有關呢? – CodesInChaos 2011-06-16 21:36:29

回答

2

你可以做這樣的事情:

stringValue = stringValue.Replace("\\t", "\t"); 

我寫了下面的方法來代替一堆常見的轉義字符序列。

public static string LiteralValue(this string value) 
    { 
     return value 
      .Replace("\\\\", "\\") 
      .Replace("\\a", "\a") 
      .Replace("\\b", "\b") 
      .Replace("\\f", "\f") 
      .Replace("\\n", "\n") 
      .Replace("\\r", "\r") 
      .Replace("\\t", "\t") 
      .Replace("\\v", "\v") 
      .Replace("\\0", "\0"); 
    } 
+0

對於較長的字符串,由於每個「Replace」調用的重複迭代,執行需要很長時間。 – 2011-06-16 23:44:13

+0

不幸的是,這是打破。只要試試'@​​「\\ t」'/'「\\\\ t」'這將變成'「\ t」' – CodesInChaos 2011-12-30 11:24:42

4

剛剛刪除@前綴怎麼樣?

逐字和常規字符串文字是在您的源代碼中編寫字符串的方式。在運行時,它們之間沒有區別。然後他們只是普通的字符串。

如果你想處理轉義在運行序列,你可以做類似如下:

string ReplaceEscapeSequences(string s) 
{ 
    Contract.Requires(s != null); 
    Contract.Ensures(Contract.Result<string>() != null); 

    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < s.Length; i++) 
    { 
    if(s[i] == '\\') 
    { 
     i++; 
     if(i == s.Length) 
     throw new ArgumentException("Escape sequence starting at end of string", s); 
     switch(s[i]) 
     { 
     case '\\': 
      sb.Append('\\'); 
      break; 
     case 't': 
      sb.Append('\t'); 
      break; 
     ... 
     } 
    } 
    else sb.Append(s[i]); 
    } 
    return sb.ToString(); 
} 
+0

+1這是正確的做法。您應該考慮將參數名稱放在'ArgumentException'中。 – 2011-06-16 23:43:03

+0

它不完整,並不容易,因爲你有其他人使用文字如十六進制代碼轉義序列特殊字符。 (http://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-c​​haracter-escape-sequences-are-available.aspx) – Luciano 2012-11-29 16:46:22

+0

@Luciano這就是'...'的意思。這只是如何編寫這樣一個算法的草圖。 – CodesInChaos 2012-11-29 17:27:45

相關問題