當我在XML配置文件中編寫分隔符值時,會遇到這個問題,通常當您在XML配置中編寫像"\t"
這樣的字符串時,解析器類如XDocument
會自動將其轉換爲@"\\t"
,以便獲得反斜槓和't'
從配置中解析出來的字符串。但是,我想要的只是一個製表符而不是兩個字符的字符串。如何在運行時值中使用.NET風格的轉義序列?
所以問題變成:給定一個包含像"\t"
這樣的轉義序列的字符串,如何將其轉換爲單字符選項卡?
當我在XML配置文件中編寫分隔符值時,會遇到這個問題,通常當您在XML配置中編寫像"\t"
這樣的字符串時,解析器類如XDocument
會自動將其轉換爲@"\\t"
,以便獲得反斜槓和't'
從配置中解析出來的字符串。但是,我想要的只是一個製表符而不是兩個字符的字符串。如何在運行時值中使用.NET風格的轉義序列?
所以問題變成:給定一個包含像"\t"
這樣的轉義序列的字符串,如何將其轉換爲單字符選項卡?
你可以做這樣的事情:
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");
}
對於較長的字符串,由於每個「Replace」調用的重複迭代,執行需要很長時間。 – 2011-06-16 23:44:13
不幸的是,這是打破。只要試試'@「\\ t」'/'「\\\\ t」'這將變成'「\ t」' – CodesInChaos 2011-12-30 11:24:42
剛剛刪除@
前綴怎麼樣?
逐字和常規字符串文字是在您的源代碼中編寫字符串的方式。在運行時,它們之間沒有區別。然後他們只是普通的字符串。
如果你想處理轉義在運行序列,你可以做類似如下:
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();
}
+1這是正確的做法。您應該考慮將參數名稱放在'ArgumentException'中。 – 2011-06-16 23:43:03
它不完整,並不容易,因爲你有其他人使用文字如十六進制代碼轉義序列特殊字符。 (http://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-character-escape-sequences-are-available.aspx) – Luciano 2012-11-29 16:46:22
@Luciano這就是'...'的意思。這只是如何編寫這樣一個算法的草圖。 – CodesInChaos 2012-11-29 17:27:45
我不明白你在問什麼。由於這些是編譯時文字,顯然沒有這樣做的程序化方式(缺少編寫掃描代碼或實用程序的實用程序)。您是否在尋找Visual Studio插件? – 2011-06-16 21:15:41
我在找的實際上是一種在XML配置中編寫tab char的方法,並將其從我的程序中讀取爲char變量。 – axings 2011-06-16 21:23:33
所以你想在運行時用字符串字符替換字符串中任何'\ t'序列?但是這與字符串文字有關呢? – CodesInChaos 2011-06-16 21:36:29