C#:如何在字符串中的每一行前加上文本?

时间:2009-09-23 15:47:19

标签: c# string implementation

'MagicFunction'的实现会如何使以下(nunit)测试通过?

public MagicFunction_Should_Prepend_Given_String_To_Each_Line()
{
    var str = @"line1
line2
line3";

    var result = MagicFunction(str, "-- ");

    var expected = @"-- line1
-- line2
-- line3";

    Assert.AreEqual(expected, result);
}

8 个答案:

答案 0 :(得分:7)

string MagicFunction(string str, string prepend)
{
   str = str.Replace("\n", "\n" + prepend);
   str = prepend + str;
   return str;
}

修改
正如其他人所指出的,换行符在不同环境之间有所不同。如果您只打算对在同一环境中创建的文件使用此函数,那么System.Environment将正常工作。但是,如果在Linux机器上创建文件然后将其传输到Windows框,则需要指定其他类型的换行符。由于Linux使用\ n而Windows使用\ r \ n,因此这段代码适用于Windows和Linux文件。如果你把麦克风扔进混合体(\ r),你就必须想出一些更多的东西。

答案 1 :(得分:3)

private static string MagicFunction(string str, string prefix)
{
    string[] lines = str.Split(new[] { '\n' });
    return string.Join("\n", lines.Select(s => prefix + s).ToArray());
}

答案 2 :(得分:1)

var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- ");

如果你想要它处理Windows(\ r \ n)NewLines或Unix(\ n)那么:

var result = "-- " + str.Replace("\n", "\n-- ");

无需触摸\ r \ n,因为它应该离开以前的位置。但是如果你想在Unix和Windows之间进行交叉,那么:

var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");

会这样做并以本地操作系统的格式返回结果

答案 3 :(得分:1)

你可以这样做:

public string MagicFunction2(string str, string prefix)
{
    bool first = true;
    using(StringWriter writer = new StringWriter())
    using(StringReader reader = new StringReader(str))
    {
        string line;
        while((line = reader.ReadLine()) != null)
        {
            if (!first)
                writer.WriteLine();
            writer.Write(prefix + line);
            first = false;
        }
        return writer.ToString();
    }
}

答案 4 :(得分:1)

怎么样:

string MagicFunction(string InputText) {
    public static Regex regex = new Regex(
          "(^|\\r\\n)",
        RegexOptions.IgnoreCase
        | RegexOptions.CultureInvariant
        | RegexOptions.IgnorePatternWhitespace
        | RegexOptions.Compiled
        );

    // This is the replacement string
    public static string regexReplace = 
          "$1-- ";

    // Replace the matched text in the InputText using the replacement pattern
    string result = regex.Replace(InputText,regexReplace);

    return result;
}

答案 5 :(得分:0)

您可以通过Environment.NewLine拆分字符串,然后将前缀添加到每个字符串中,然后通过Environment.NewLine将它们连接起来。

string MagicFunction(string prefix, string orignalString)
{
    List<string> prefixed = new List<string>();
    foreach (string s in orignalString.Split(new[]{Environment.NewLine}, StringSplitOptions.None))
    {
        prefixed.Add(prefix + s);
    }

    return String.Join(Environment.NewLine, prefixed.ToArray());
}

答案 6 :(得分:0)

这个怎么样?它使用StringBuilder,以防你计划在前面添加很多行。

string MagicFunction(string input)
{
  StringBuilder sb = new StringBuilder();
  StringReader sr = new StringReader(input);
  string line = null;

  using(StringReader sr = new StringReader(input))
  {
    while((line = sr.ReadLine()) != null)
    {
      sb.Append(String.Concat("-- ", line, System.Environment.NewLine));
    }
  }
  return sb.ToString();
}

答案 7 :(得分:0)

感谢大家的回答。我将MagicFunction实现为扩展方法。它利用了Thomas Levesque的答案,但增强了它以处理所有主要环境并假设您希望输出字符串使用输入字符串的相同换行符终止符。

我赞成Thomas Levesque的回答(超过Spencer Ruport,Fredrik Mork,Lazarus和JDunkerley),因为它表现最佳。我会在我的博客上发布效果结果,稍后会为感兴趣的人链接。

(显然,'MagicFunctionIO'的功能名称应该改变。我选择'PrependEachLineWith')

public static string MagicFunctionIO(this string self, string prefix)
{
  string terminator = self.GetLineTerminator();
  using (StringWriter writer = new StringWriter())
  {
    using (StringReader reader = new StringReader(self))
    {
      bool first = true;
      string line;
      while ((line = reader.ReadLine()) != null)
      {
        if (!first)
          writer.Write(terminator);
        writer.Write(prefix + line);
        first = false;
      }
      return writer.ToString();
    }
  }
}

public static string GetLineTerminator(this string self)
{
  if (self.Contains("\r\n")) // windows
    return "\r\n";
  else if (self.Contains("\n")) // unix
    return "\n";
  else if (self.Contains("\r")) // mac
    return "\r";
  else // default, unknown env or no line terminators
    return Environment.NewLine;
}