如何在C#中删除字符串中的空行?
我正在使用C#(Windows Forms)生成一些文本文件,但出现了一些空行。如何在生成字符串后将它们删除(使用StringBuilder和TextWriter)。
示例文本文件:
THIS IS A LINE
THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!
如何在C#中删除字符串中的空行?
我正在使用C#(Windows Forms)生成一些文本文件,但出现了一些空行。如何在生成字符串后将它们删除(使用StringBuilder和TextWriter)。
示例文本文件:
THIS IS A LINE
THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!
如果您还想删除只包含空格的行,请使用
resultString = Regex.Replace(subjectString, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);
^\s+$
将删除从第一个空行到最后一个连续的空行(包括仅包含制表符或空格的行)之间的所有内容。
[\r\n]*
然后将删除最后的CRLF(或者只是LF,这很重要,因为.NET正则表达式引擎会将$
匹配到\r
和\n
之间,非常有趣)。
\s+
改成\s*
,那么它也应该会删除最后一行。 - Tim PietzckerTim Pietzcker - it对我没用。我需要做一些小改动,但还是谢谢!
额,C#正则表达式.. 我又不得不做出改变,但现在它运行良好:
private string RemoveEmptyLines(string lines)
{
return Regex.Replace(lines, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd();
}
Example: http://regex101.com/r/vE5mP1/2
您可以尝试使用 String.Replace("\n\n", "\n");
。
Trim()
。但是,对于 \n\n\n
这种情况仍然无法工作。 - HappyNomad请尝试以下操作
Regex.Replace(subjectString, @"^\r?\n?$", "", RegexOptions.Multiline);
private string remove_space(string st)
{
String final = "";
char[] b = new char[] { '\r', '\n' };
String[] lines = st.Split(b, StringSplitOptions.RemoveEmptyEntries);
foreach (String s in lines)
{
if (!String.IsNullOrWhiteSpace(s))
{
final += s;
final += Environment.NewLine;
}
}
return final;
}
\n
的字符串来测试你的方法。考虑使用 StringBuilder
替代 +String。我认为将你的函数命名为 RemoveEmptyLines 更合理。 - AaAYourradTextBox.Lines = YourradTextBox.Lines.Where(p => p.Length > 0).ToArray();
本文内容源自Marco Minerva [MCPD]的文章,原文链接:如果多行文本框包含特定字符串,则删除其中的行 - C#
private static string RemoveEmptyLines(string text)
{
var lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var sb = new StringBuilder(text.Length);
foreach (var line in lines)
{
sb.AppendLine(line);
}
return sb.ToString();
}
Environment.NewLine
是一个字符串,无法适应字符数组。 - AaA这里提到的方法都没有完全帮助我解决问题,但我找到了一种解决方法。
Split text to lines - collection of strings (with or without empty strings, also Trim() each string).
Add these lines to multiline string.
public static IEnumerable<string> SplitToLines(this string inputText, bool removeEmptyLines = true)
{
if (inputText == null)
{
yield break;
}
using (StringReader reader = new StringReader(inputText))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (removeEmptyLines && !string.IsNullOrWhiteSpace(line))
yield return line.Trim();
else
yield return line.Trim();
}
}
}
public static string ToMultilineText(this string text)
{
var lines = text.SplitToLines();
return string.Join(Environment.NewLine, lines);
}
基于Evgeny Sobolev的代码,我编写了这个扩展方法,它还使用TrimEnd(TrimNewLineChars)修剪了最后一个(过时的)换行符:
public static class StringExtensions
{
private static readonly char[] TrimNewLineChars = Environment.NewLine.ToCharArray();
public static string RemoveEmptyLines(this string str)
{
if (str == null)
{
return null;
}
var lines = str.Split(TrimNewLineChars, StringSplitOptions.RemoveEmptyEntries);
var stringBuilder = new StringBuilder(str.Length);
foreach (var line in lines)
{
stringBuilder.AppendLine(line);
}
return stringBuilder.ToString().TrimEnd(TrimNewLineChars);
}
}
Environment.NewLine
只有在使用当前系统的默认行尾序列创建文件时才有效。大多数高级文本编辑器都可以处理/设置/保存格式(在Visual Studio Code中,您可以通过某种隐藏功能单击显示的设置(例如,“LF”)来更改给定文件的行尾序列)。 - Peter Mortensen我尝试了之前的答案,但其中一些使用正则表达式的并不能正常工作。
如果你使用正则表达式来查找空行,那么你不能用同样的方法来删除。
因为它会删除非空行中的“换行符”。
你必须使用“正则表达式组”来进行替换。
这里有一些其他不使用正则表达式的答案可能会有性能问题。
private string remove_empty_lines(string text) {
StringBuilder text_sb = new StringBuilder(text);
Regex rg_spaces = new Regex(@"(\r\n|\r|\n)([\s]+\r\n|[\s]+\r|[\s]+\n)");
Match m = rg_spaces.Match(text_sb.ToString());
while (m.Success) {
text_sb = text_sb.Replace(m.Groups[2].Value, "");
m = rg_spaces.Match(text_sb.ToString());
}
return text_sb.ToString().Trim();
}