替换逗号分隔列表的单个字段中的字符

时间:2014-02-20 10:39:50

标签: c# string

我的c#代码中有字符串

a,b,c,d,"e,f",g,h

我想用“e f”替换“e,f”,即','在倒置的逗号里面应该用空格替换。

我尝试使用string.split,但它不适用于我。

5 个答案:

答案 0 :(得分:3)

好的,我不会想到正则表达式的方法,所以我将提供一个老式的循环方法,它将起作用:

string DoReplace(string input)
{
    bool isInner = false;//flag to detect if we are in the inner string or not
    string result = "";//result to return

    foreach(char c in input)//loop each character in the input string
    {
        if(isInner && c == ',')//if we are in an inner string and it is a comma, append space
            result += " ";
        else//otherwise append the character
            result += c;

        if(c == '"')//if we have hit an inner quote, toggle the flag
            isInner = !isInner;
    }

    return result;
}

注意:此解决方案假设只有一个级别的内部引号,例如,您不能拥有"a,b,c,"d,e,"f,g",h",i,j" - 因为这只是简单的疯狂!

答案 1 :(得分:2)

对于您只需要匹配一对字母的情况,以下正则表达式将起作用:

string source = "a,b,c,d,\"e,f\",g,h";
string pattern = "\"([\\w]),([\\w])\"";
string replace = "\"$1 $2\"";
string result = Regex.Replace(source, pattern, replace);
Console.WriteLine(result); // a,b,c,d,"e f",g,h

打破模式,它匹配任何存在“X,X”序列的实例,其中X是任何字母,并用相同的序列替换它,字母之间有空格而不是逗号

如果您需要根据需要将其匹配多个字母等,您可以轻松扩展此功能。

如果您可以在引号中包含以逗号分隔的多个字母,则可以执行以下操作。示例文本为a,b,c,d,"e,f,a",g,h

string source = "a,b,c,d,\"e,f,a\",g,h";
string pattern = "\"([ ,\\w]+),([ ,\\w]+)\"";
string replace = "\"$1 $2\"";
string result = source;
while (Regex.IsMatch(result, pattern)) {
    result = Regex.Replace(result, pattern, replace);
}
Console.WriteLine(result); // a,b,c,d,"e f a",g,h

与第一个相比,它做了类似的事情,但只删除了被引号括起来的字母夹在中的任何逗号,并重复它直到删除所有情况。

答案 2 :(得分:2)

这是一个有点脆弱但简单的解决方案:

string.Join("\"", line.Split('"').Select((s, i) => i % 2 == 0 ? s : s.Replace(",", " ")))

它很脆弱,因为它不能处理在双引号内转义双引号的CSV版本。

答案 3 :(得分:0)

使用以下代码:

        string str = "a,b,c,d,\"e,f\",g,h";
        string[] str2 = str.Split('\"');
        var str3 = str2.Select(p => ((p.StartsWith(",") || p.EndsWith(",")) ? p : p.Replace(',', ' '))).ToList();
        str = string.Join("", str3);

答案 4 :(得分:-1)

使用Split()Join()

string input = "a,b,c,d,\"e,f\",g,h";

string[] pieces = input.Split('"');

for ( int i = 1; i < pieces.Length; i += 2 )
{
    pieces[i] = string.Join(" ", pieces[i].Split(','));
}

string output = string.Join("\"", pieces);

Console.WriteLine(output);
// output: a,b,c,d,"e f",g,h