2011-03-14 100 views
6

我正在寫一個小班來讀取文件中的鍵值對列表並寫入Dictionary<string, string>。此文件將具有以下格式:從字符串中刪除所有「不可見」字符?

key1:value1 
key2:value2 
key3:value3 
... 

這應該是很容易做到,但由於用戶是要手工編輯這個文件,我應該如何處理空格,製表符,多餘的跳躍之類的東西?我大概可以使用Replace來刪除空格和製表符,但是,還有其他「隱形」字符嗎?

或者也許我可以刪除所有不是字母數字,「:」和行跳轉的字符(因爲行跳是將另一對分開的行),然後刪除所有多餘的行跳轉。如果這樣,我不知道如何刪除「除了一些」之外的所有字符。

當然,我也可以檢查「key1:value1:somethingelse」等錯誤。但是這樣的東西實際上並不重要,因爲這顯然是用戶的錯,我只會顯示「無效格式」消息。我只是想處理基本的東西,然後把所有的東西放在try/catch塊中,以防萬一出錯。

注意:我根本不需要任何空格,即使是在一個鍵或值中。

+1

最自然的解決方案(對於這樣一個簡單的問題,顯然有很多正確的解決方案)取決於你如何從文件中讀取數據。你能發佈一個相關的代碼片段嗎? – Jon 2011-03-14 19:18:01

+0

「隱形」是什麼意思? http://www.fileformat.info/info/unicode/char/200c/index.htm(ZERO WIDTH [NON] JOINER,一般標點符號)或者http://www.fileformat.info/info/unicode/ char/202a/index.htm(左對右嵌入另一個一般標點符號)不可見? :-)和http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters#Mathematical_invisibles ...你怎麼能沒有生活? :-) :-)這裏有一個關於U字符的可見性的問題http://stackoverflow.com/questions/304483/determining-if-a-unicode-character-is-visible – xanatos 2011-03-14 19:22:50

回答

2

的要求過於模糊。考慮:

「什麼時候是空格鍵?鍵?」
「何時分隔符是值?鍵?」
「什麼時候是製表符值?鍵?」
「在值?鍵的上下文中使用分隔符時,值結束於何處?

這些問題會導致代碼被一個關閉和糟糕的用戶體驗所填滿。這就是爲什麼我們有語言規則/語法。

定義一個簡單的語法並去掉大部分猜測。

「{}鍵」: 「{}值」,

這裏有包含在引號內,並且經由一個分隔符隔開的鍵/值對(,)。所有無關字符都可以忽略。您可以使用使用XML,但這可能嚇跑不太科技的用戶。

請注意,引號是任意的。隨意更換任何不需要太多轉義的集合容器(只要注意複雜性)。

就我個人而言,我會將它包裝在一個簡單的用戶界面中,並將數據序列化爲XML。有時候不這樣做,但你沒有理由不給我。

+0

其實你是對的。這將是我的語法:鍵可以是: 「A-ZA-Z0-9」, 值可以是: 「A-ZA-Z0-9」, 鍵/值分隔符: 「:」, 行分隔符:「 \ N」。我認爲我可以很容易地找出一些正則表達式來刪除所有不必要的字符,也許通過使用否定運算符。 – Juan 2011-03-14 19:58:09

+0

我想我只是懶惰:)。我就像「好的,我會在5分鐘內完成」。我現在應該已經知道,這看起來並不那麼容易。 – Juan 2011-03-14 20:04:09

7

如果使用正則表達式(正則表達式),可以用一個函數過濾掉所有這些。

string newVariable Regex.Replace(variable,@「\ s」,「」);

這將刪除空格,不可見的字符\ n和\ r。

+0

這將從鍵和值也是如此。您可能只想刪除\ t,\ n,\ r和雙空格等控制字符。 – 2011-03-14 19:20:31

+0

我相信他明確表示他想處理空白,製表符以及包含控制字符的不可見字符。 – 2011-03-14 19:23:34

+0

控制字符,是的,但空格可能是鍵/值對的值部分中的有效字符。 OP沒有說明,這就是爲什麼它只是一個評論,指出替代品。 – 2011-03-14 19:27:23

2
var split = textLine.Split(":").Select(s => s.Trim()).ToArray(); 

裁剪()函數將刪除所有的不相關的空格。請注意,這將在鍵或值內保留空白,您可能需要分別考慮這些空白。

+0

修剪僅在開始時刪除空格或字符串的結尾,而不是全部空格。 – 2011-03-14 19:19:11

+0

@Drackir,是的,剛抓住那個;這引發了你是否真的想要刪除插入到鍵中間的空格的問題。 – 2011-03-14 19:20:17

+0

對我來說,OP想要刪除所有空格。 – 2011-03-14 19:23:43

2

您可以使用string.Trim()刪除空白字符:

var results = lines 
     .Select(line => { 
      var pair = line.Split(new[] {':'}, 2); 
      return new { 
       Key = pair[0].Trim(), 
       Value = pair[1].Trim(), 
      }; 
     }).ToList(); 

但是,如果你想刪除所有的空格,您可以使用正則表達式:

var whiteSpaceRegex = new Regex(@"\s+", RegexOptions.Compiled); 
var results = lines 
     .Select(line => { 
      var pair = line.Split(new[] {':'}, 2); 
      return new { 
       Key = whiteSpaceRegex.Replace(pair[0], string.Empty), 
       Value = whiteSpaceRegex.Replace(pair[1], string.Empty), 
      }; 
     }).ToList(); 
0

如果它不「T必須要快,你可以使用LINQ:

string clean = new String(tainted.Where(c => 0 <= "ABCDabcd1234:\r\n".IndexOf(c)).ToArray()); 
16

最近我做了這一個,當我最終生氣了太多無證垃圾形成不良xml正在通過飼料。它有效地剪掉任何沒有一個空間和〜之間的ASCII桌子上掉下來:

static public string StripControlChars(this string s) 
{ 
    return Regex.Replace(s, @"[^\x20-\x7F]", ""); 
} 

與其他正則表達式結合實例已經張貼在你想要去的,應該得到你。

2

經常咬我們的「白色」空間之一是不可破壞的空間。此外,我們的系統必須與MS-Dynamics兼容,而MS-Dynamics的限制性更強。首先,我創建了一個函數,將第8位字符映射到它們的近似第7位對應字符,然後刪除不在x20至x7f範圍內的任何內容,這些範圍受Dynamics界面的進一步限制。

Regex.Replace(s, @"[^\x20-\x7F]", "") 

應該做那個工作。