C#StringBuilder:检查它是否以新行结束
我有一个C#StringBuilder:检查它是否以新行结束,c#,stringbuilder,C#,Stringbuilder,我有一个StringBuilder,它可以积累代码。在某些情况下,代码块之间有两行空行,我想将这一行设为空行。 如何检查当前代码末尾是否已有空行?(由于性能问题,我不喜欢使用它的ToString()方法。)您可以通过索引访问StringBuilder中的任何字符,就像使用字符串一样 var sb = new StringBuilder(); sb.Append("Hello world!\n"); Console.WriteLine(sb[sb.Length - 1] == '\n'); //
StringBuilder
,它可以积累代码。在某些情况下,代码块之间有两行空行,我想将这一行设为空行。如何检查当前代码末尾是否已有空行?(由于性能问题,我不喜欢使用它的
ToString()
方法。)您可以通过索引访问StringBuilder
中的任何字符,就像使用字符串一样
var sb = new StringBuilder();
sb.Append("Hello world!\n");
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True
可以使用正则表达式规范化换行:
var test = @"hello
moop
hello";
var regex = new Regex(@"(?:\r\n|[\r\n])+");
var newLinesNormalized = regex.Replace(test, Environment.NewLine);
输出:
hello
moop
hello
下面是完整的示例
class string_builder
{
string previousvalue = null;
StringBuilder sB;
public string_builder()
{
sB = new StringBuilder();
}
public void AppendToStringBuilder(string new_val)
{
if (previousvalue.EndsWith("\n") && !String.IsNullOrEmpty(previousvalue) )
{
sB.Append(new_val);
}
else
{
sB.AppendLine(new_val);
}
previousvalue = new_val;
}
}
class Program
{
public static void Main(string[] args)
{
string_builder sb = new string_builder();
sb.AppendToStringBuilder("this is line1\n");
sb.AppendToStringBuilder("this is line2");
sb.AppendToStringBuilder("\nthis is line3\n");
}
}
因为在代码中间我不关心2个空行,最简单的方法是使用< /P>
myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine);
此选项不需要对使用代码累加器的类进行任何更改 如果有人像我在这里那样在这里结束,那么通常的方法是检查StringBuilder
的结尾是否有任意字符串,并且必须在其上使用ToString
public static bool EndsWith(this StringBuilder haystack, string needle)
{
var needleLength = needle.Length - 1;
var haystackLength = haystack.Length - 1;
if (haystackLength < needleLength)
{
return false;
}
for (int i = 0; i < needleLength; i++)
{
if (haystack[haystackLength - i] != needle[needleLength - i])
{
return false;
}
}
return true;
}
public static bool EndsWith(此StringBuilder草垛,字符串针)
{
var针头长度=针头。长度-1;
var haystackLength=haystack.Length-1;
if(长度<针头长度)
{
返回false;
}
对于(int i=0;i
单行检查。使用字符串类型,而不是StringBuilder,但您应该了解其基本概念
if (theString.Substring(theString.Length - Environment.NewLine.Length, Environment.NewLine.Length).Contains(Environment.NewLine))
{
//theString does end with a NewLine
}
else
{
//theString does NOT end with a NewLine
}
您必须在添加线/块时检查线/块,或者将所有“双新线”替换为一条,并修剪末端。可以使用“替换”并将两条Environment.NewLine的任何引用替换为一条Environment.NewLine(位于建筑末端)。另一种可能是使用ToString(长度-1,1)来获得最终角色。这就是我最终所做的。它被公布为答案,但被删除,因为有人提到,它也将删除双新行在代码中间。这对我来说真的不重要,所以如果这个解决方案将作为答案发布,我会标记它。我说的是巨大的代码块。我试着检查最后的字符,但它变得混乱。为什么它变得混乱?如果您编写了一个接受StringBuilder
的方法,那么您可以创建一个简洁的小子程序。分而治之。请注意,这适用于Linux和Windows,但不适用于Mac OSX之前的Mac line endings,它以\r
结尾(但这很容易编程,是的,是史前的)。这将需要对我的代码进行巨大的更改-我希望将更改保持在最低限度。不过,感谢您提供的代码示例。这是一个仅使用代码的示例,无法回答标题中的问题。这与StringBuilder
有何关系?如果myCode
不使用Environment.NewLine
作为行分隔符,这将不起作用。此外,这并没有比ToString
更有效。即使这似乎适用于您的特定情况,但这并不是对您提出的问题的回答。这当然只适用于平台默认行结尾,这可能有点自以为是。它似乎也不使用StringBuilder
。@MaartenBodewes平台检测不是一项要求,我在开头一行中确实说过它不使用StringBuilder。在重读原始版本时,我不确定它是否解决了他的问题——他是想检查整个字符串末尾是否有额外的换行符,还是想分析字符串中的每一行并删除双换行符……当然,问题是由特定用户编写的,但它们应该适用于其他用户。如果这只适用于平台编码,那么至少在回答中说明,否则复制代码的每个人都可能遇到问题。该问题明确指出,最好不要使用字符串,但除此之外,如果可以使用字符串,该问题对其他人的用处会小得多;这是一个更容易解决的问题(regex等)。谢谢你再看一眼。可能不止一行结尾,而你的针只接受一根线。