C#:如何在字符串中的每一行前加上文本?
要使以下(nunit)测试通过,“MagicFunction”的实现是什么样子的C#:如何在字符串中的每一行前加上文本?,c#,string,implementation,C#,String,Implementation,要使以下(nunit)测试通过,“MagicFunction”的实现是什么样子的 public MagicFunction_Should_Prepend_Given_String_To_Each_Line() { var str = @"line1 line2 line3"; var result = MagicFunction(str, "-- "); var expected = @"-- line1 -- line2 -- line3"; Assert
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);
}
如果您想让它处理Windows(\r\n)换行或Unix(\n),则:
无需触摸\r,因为它将留在原来的位置。但是,如果要在Unix和Windows之间进行交叉,请执行以下操作:
var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");
将执行此操作并以本地操作系统的格式返回结果
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文件。如果您要将Mac电脑加入到混合(\r)中,您必须想出一些更复杂的方法。您可以这样做:
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();
}
}
您可以按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());
}
string MagicFunction(字符串前缀、字符串原始字符串)
{
列表前缀=新列表();
foreach(orignalString.Split(new[]{Environment.NewLine},StringSplitOptions.None)中的字符串s)
{
前缀。添加(前缀+s);
}
返回字符串.Join(Environment.NewLine,前缀为.ToArray());
}
那么:
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;
}
这个怎么样。它使用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();
}
谢谢大家的回答。我实现了MagicFunction作为扩展方法。它利用了Thomas Levesque的答案,但得到了增强以处理所有主要环境,并假设您希望输出字符串使用输入字符串的同一换行符 我喜欢托马斯·列夫斯基的答案(胜过斯宾塞·鲁波特、弗雷德里克·莫克、拉扎勒斯和伊杜克利),因为这是表现最好的答案。我将在我的博客上发布性能结果,稍后将链接到这里,供感兴趣的人参考 (显然,“MagicFunctionIO”的函数名应该更改。我使用了“PrependEachLineWith”)
那么“\r”字符呢?或者更好,Environment.NewLine呢。我很确定这就是它的目的。:)@SpencerRuport replace应该是
replace
(坦率地说,建议编辑少于6个字符是不可能的)@wondra-修复!谢谢。@Thomas:Environment.NewLine将使用操作系统的任何换行符字符串。唯一的问题是,如果在unix上解析windows文件,或者反之亦然,是的,这就是我要说的问题。。。在Windows或vice上操作UNIX文件是很常见的。versaI刚刚用“\r\n”(Windows)、“\n”(Linux)和“\r”(Mac)尝试过,它在所有情况下都有效。但是它没有保留原始的新行标记,它总是在输出字符串中使用Environment.NewLine。嗯,有点小错误。即使原始字符串没有换行符,它也总是在字符串末尾添加换行符。您可能需要考虑\r\n-var lines=str.Split(新字符[]{'\r','\n'},StringSplitOptions.RemoveEmptyEntries)
@Gishu:我用\r\n
和\n
换行符测试了这个方法,它可以同时使用这两种方法。它不能仅与\r
一起使用。在\n
上拆分的一个好处是,结果字符串包含与输入相同的样式换行符(即使字符串中的\r\n
和\n
换行符混合使用)。
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());
}
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;
}
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();
}
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;
}