使用Replace()从一开始就删除引号将其全部删除

时间:2017-01-11 08:56:03

标签: c# string replace

我正在尝试从引号过滤 csv文件。这一行奇怪地删除了该行中的所有引号:

之前:"NewClient"Name"

foo = foo.Replace(foo.Substring(0, 1), "");

之后:NewClientName

为什么会这样?不应该Replace()方法只删除第一次出现?

4 个答案:

答案 0 :(得分:2)

通常在使用CSV时,我们引用:

a                 -> "a"
a"b               -> "a""b"
NewClient"Name    -> "NewClient""Name"

削减这样的报价,即

"NewClient""Name" -> NewClient"Name

"NewClient"Name"语法错误时,您可以尝试

private static string CutQuotation(string value) {
  if (string.IsNullOrEmpty(value))
    return value;
  else if (!value.Contains('"'))
    return value;

  if (value.Length == 1)
    throw new FormatException("Incorrect quotation format: string can't be of length 1.");
  else if (value[0] != '"')
    throw new FormatException("Incorrect quotation format: string must start with \".");
  else if (value[value.Length - 1] != '"')
    throw new FormatException("Incorrect quotation format: string must end with \".");

  StringBuilder builder = new StringBuilder(value.Length);

  for (int i = 1; i < value.Length - 1; ++i) 
    if (value[i] == '"') 
      if (i == value.Length - 2)
        throw new FormatException("Incorrect quotation format. Dangling \".");
      else if (value[++i] == '"') 
        builder.Append(value[i]);
      else
        throw new FormatException("Incorrect quotation format. Dangling \".");
    else
      builder.Append(value[i]);

  return builder.ToString();
}

正如您所看到的,这不仅仅是单Replace()例程。

试验:

 // abc - no quotation
 Console.WriteLine(CutQuotation("abc")); 
 // abc - simple quotation cut
 Console.WriteLine(CutQuotation("\"abc\"")); 
 // "abc" - double quotation
 Console.WriteLine(CutQuotation("\"\"abc\"\"")); 
 // a"bc - quotation in the middle
 Console.WriteLine(CutQuotation("\"a\"\"bc\"")); 

答案 1 :(得分:1)

  

不应该替换方法只删除第一次出现吗?

您会这么认为,因为您正在使用public class First{ public static bool FirstBool {get; set;} public static string aString {get; set;} } public class Second{ public static bool AnotherBool {get; set;} public static string aString {get; set;} } public class Third{ public static bool ThirdBool {get; set;} public static string aString {get; set;} public static string AdditionalString {get; set;} }

Substring(0, 1)

但是在调用string foo = "\"NewClient\"Name\""; foo = foo.Replace(foo.Substring(0, 1), ""); 之前获得子字符串。换句话说,您的Replace()Substring()彼此无关,因此代码相当于:

Replace()

String.Replace()取代所有出现次数。

如果您只想替换第一个实例,请参阅How do I replace the *first instance* of a string in .NET?。如果您只是想要删除第一个字符,请参阅Fastest way to remove first char in a string。如果要从字符串的开头删除特定字符,请参阅C# TrimStart with string parameter

答案 2 :(得分:0)

不,替换方法替换字符串中char的所有活动(参见https://msdn.microsoft.com/en-us/library/fk49wtc1(v=vs.110).aspx)。

如果你只需要删除第一个/最后一个字符(如果有的话),你可以使用修剪功能: https://msdn.microsoft.com/en-us/library/d4tt83f9(v=vs.110).aspx

在你的情况下:

 result[i, 0] = result[i, 0].Trim('"')

答案 3 :(得分:0)

您的要求适用于此。

string strTest = "\"NewClient\"Name\"";
strTest = strTest.TrimStart('"');

在你的情况下它是

result[i, 0] = result[i, 0].TrimStart('"');

* Replace将删除并替换给定实例中所有匹配的char / string。