2009-06-19 103 views
2

假設我有一個這樣的字符串:如何將空格(除引號內的空格)轉換爲C#中的逗號?

one two three "four five six" seven eight 

,我想將它轉化成這樣:

one,two,three,"four five six",seven,eight 

是什麼在C#中要做到這一點最簡單的方法?

+0

你真的想要報價出現在最終的輸出?在他們出現的時候,你不能用逗號分割結果字符串來對每個項目進行進一步的處理。 – JeffK 2009-06-19 21:14:49

+0

@JeffK:對於這個特定的應用程序,「四五六」被認爲是一個單一的項目。 – raven 2009-06-19 23:13:29

+0

對,但你需要它有周圍的報價。換句話說,以下哪一項是您想要的結果? 一,二,三,「四五六」,七,八 <> 一,二,三,四五六,七,八 我的問題是你是否真的想要的第一個結果。這些引用對我後來的處理來說似乎是一個問題;在使用該行之前,您不需要刪除它們嗎? – JeffK 2009-06-20 01:27:07

回答

0

下面是我想出了一個更可重複使用的功能:

private string ReplaceWithExceptions(string source, char charToReplace, 
    char replacementChar, char exceptionChar) 
{ 
    bool ignoreReplacementChar = false; 
    char[] sourceArray = source.ToCharArray(); 

    for (int i = 0; i < sourceArray.Length; i++) 
    { 
     if (sourceArray[i] == exceptionChar) 
     { 
      ignoreReplacementChar = !ignoreReplacementChar; 
     } 
     else 
     { 
      if (!ignoreReplacementChar) 
      { 
       if (sourceArray[i] == charToReplace) 
       { 
        sourceArray[i] = replacementChar; 
       } 
      } 
     } 
    } 

    return new string(sourceArray); 
} 

用法:

string test = "one two three \"four five six\" seven eight"; 
System.Diagnostics.Debug.WriteLine(ReplaceWithExceptions(test, char.Parse(" "), 
    char.Parse(","), char.Parse("\""))); 
0

我會使用Regex類來達到這個目的。

正則表達式可以用來匹配你的輸入,將它分解成單獨的組,然後你可以重新組合,但是你想要的。你可以在regex classes here上找到相關文件。

Regex rx = new Regex("(\w)|([\"]\w+[\"])"); 
MatchCollection matches = rx.Matches("first second \"third fourth fifth\" sixth"); 
string.Join(", ", matches.Select(x => x.Value).ToArray()); 
9

假設引號是不可避免的,您可以執行以下操作。

public string SpaceToComma(string input) { 
    var builder = new System.Text.StringBuilder(); 
    var inQuotes = false; 
    foreach (var cur in input) { 
    switch (cur) { 
     case ' ': 
     builder.Append(inQuotes ? cur : ','); 
     break; 
     case '"': 
     inQuotes = !inQuotes; 
     builder.Append(cur); 
     break; 
     default: 
     builder.Append(cur); 
     break; 
    } 
    } 
    return builder.ToString(); 
} 
2
static string Space2Comma(string s) 
{ 
    return string.Concat(s.Split('"').Select 
     ((x, i) => i % 2 == 0 ? x.Replace(' ', ',') : '"' + x + '"').ToArray()); 
} 
0

這可能是矯枉過正,但如果你認爲這個問題可以概括,如具有必要被其他類型的字符分割,或者有額外的定義令牌的規則,您應該考慮使用解析器生成器(如Coco)或自行編寫一個簡單的。例如,Coco/R將根據您提供的EBNF語法生成一個詞法分析器和分析器。詞法分析器將是DFA或狀態機,它是由JaredPar提供的代碼的一般形式。對於可可/ R你的語法定義是這樣的:

CHARACTERS 
alphanum = 'A'..'Z' + 'a'..'z' + '0'..'9'. 

TOKENS 
unit = '"' {alphanum|' '} '"' | {alphanum}. 

隨後將所得詞法分析器將掃描和相應tokanize輸入。

0

根據我對原始問題的評論,如果你不需要最終結果中的引號,這將完成工作。如果你需要報價,隨時忽略這一點。

private String SpaceToComma(string input) 
{ 
    String[] temp = input.Split(new Char[] { '"' }, StringSplitOptions.RemoveEmptyEntries); 
    for (Int32 i = 0; i < temp.Length; i += 2) 
    { 
     temp[i] = temp[i].Trim().Replace(' ', ','); 
    } 
    return String.Join(",", temp); 
} 
0

@Mehrdad打我,但想無論如何,我會張貼:

static string Convert(string input) 
{ 
    var slices = input 
     .Split('"') 
     .Select((s, i) => i % 2 != 0 
      ? @"""" + s + @"""" 
      : s.Trim().Replace(' ', ',')); 

    return string.Join(",", slices.ToArray()); 
} 

LINQified和測試,:-) ......對於一個完整的控制檯應用程序:http://pastebin.com/f23bac59b

相關問題