假設我有一個這樣的字符串:如何將空格(除引號內的空格)轉換爲C#中的逗號?
one two three "four five six" seven eight
,我想將它轉化成這樣:
one,two,three,"four five six",seven,eight
是什麼在C#中要做到這一點最簡單的方法?
假設我有一個這樣的字符串:如何將空格(除引號內的空格)轉換爲C#中的逗號?
one two three "four five six" seven eight
,我想將它轉化成這樣:
one,two,three,"four five six",seven,eight
是什麼在C#中要做到這一點最簡單的方法?
下面是我想出了一個更可重複使用的功能:
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("\"")));
我會使用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());
假設引號是不可避免的,您可以執行以下操作。
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();
}
static string Space2Comma(string s)
{
return string.Concat(s.Split('"').Select
((x, i) => i % 2 == 0 ? x.Replace(' ', ',') : '"' + x + '"').ToArray());
}
我的第一個猜測是使用已經寫了一個解析器和簡單的改變分隔符和引號字符滿足您的需求(這是和「)。
它看起來像這樣可用您在C#: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx
或許,如果你更改爲「」,它可能會滿足您的需求在文件中讀取分隔符,那麼它只是一個調用的string.join()一每一行的事
這可能是矯枉過正,但如果你認爲這個問題可以概括,如具有必要被其他類型的字符分割,或者有額外的定義令牌的規則,您應該考慮使用解析器生成器(如Coco)或自行編寫一個簡單的。例如,Coco/R將根據您提供的EBNF語法生成一個詞法分析器和分析器。詞法分析器將是DFA或狀態機,它是由JaredPar提供的代碼的一般形式。對於可可/ R你的語法定義是這樣的:
CHARACTERS
alphanum = 'A'..'Z' + 'a'..'z' + '0'..'9'.
TOKENS
unit = '"' {alphanum|' '} '"' | {alphanum}.
隨後將所得詞法分析器將掃描和相應tokanize輸入。
根據我對原始問題的評論,如果你不需要最終結果中的引號,這將完成工作。如果你做需要報價,隨時忽略這一點。
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);
}
@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
你真的想要報價出現在最終的輸出?在他們出現的時候,你不能用逗號分割結果字符串來對每個項目進行進一步的處理。 – JeffK 2009-06-19 21:14:49
@JeffK:對於這個特定的應用程序,「四五六」被認爲是一個單一的項目。 – raven 2009-06-19 23:13:29
對,但你需要它有周圍的報價。換句話說,以下哪一項是您想要的結果? 一,二,三,「四五六」,七,八 <> 一,二,三,四五六,七,八 我的問題是你是否真的想要的第一個結果。這些引用對我後來的處理來說似乎是一個問題;在使用該行之前,您不需要刪除它們嗎? –
JeffK
2009-06-20 01:27:07