假设我有一个这样的字符串:
one two three "four five six" seven eight
我希望将其转换为:
one,two,three,"four five six",seven,eight
在C#中最简单的方法是什么?
答案 0 :(得分: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();
}
答案 1 :(得分:2)
static string Space2Comma(string s)
{
return string.Concat(s.Split('"').Select
((x, i) => i % 2 == 0 ? x.Replace(' ', ',') : '"' + x + '"').ToArray());
}
答案 2 :(得分: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() );
答案 3 :(得分:0)
我的第一个猜测是使用已编写的解析器,并简单地更改符合您需要的分隔符和引号字符(分别为“和”)。
看起来你可以在C#中使用它: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx
也许如果您将分隔符更改为“”,它可能适合您在文件中读取的需要,然后只需为每行调用String.Join()a。
答案 4 :(得分: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("\"")));
答案 5 :(得分:0)
这可能有些过分,但是如果您认为问题可能会泛化,例如需要通过其他类型的字符进行拆分,或者有其他规则来定义令牌,则应考虑使用解析器生成器,例如{ {3}}或者自己写一个简单的。例如,Coco / R将根据您提供的EBNF语法生成词法分析器和解析器。词法分析器将是DFA或状态机,它是JaredPar提供的代码的通用形式。你对Coco / R的语法定义如下:
CHARACTERS
alphanum = 'A'..'Z' + 'a'..'z' + '0'..'9'.
TOKENS
unit = '"' {alphanum|' '} '"' | {alphanum}.
然后,生成的词法分析器将相应地扫描并设置您的输入。
答案 6 :(得分: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);
}
答案 7 :(得分: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