C# 如何从格式化字符串中删除空行
如何在C#中删除字符串中的空行 我正在用C#(Windows窗体)生成一些文本文件,由于某些原因,其中有一些空行。生成字符串后如何删除它们(使用and) 示例文本文件:C# 如何从格式化字符串中删除空行,c#,regex,string,stringbuilder,C#,Regex,String,Stringbuilder,如何在C#中删除字符串中的空行 我正在用C#(Windows窗体)生成一些文本文件,由于某些原因,其中有一些空行。生成字符串后如何删除它们(使用and) 示例文本文件: THIS IS A LINE THIS IS ANOTHER LINE AFTER SOME EMPTY LINES! 试试这个 Regex.Replace(subjectString, @"^\r?\n?$", "", RegexOptions.Multiline); 您可以尝试String.Replace(“\n\
THIS IS A LINE
THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!
试试这个
Regex.Replace(subjectString, @"^\r?\n?$", "", RegexOptions.Multiline);
您可以尝试
String.Replace(“\n\n”,“\n”)代码>如果您还想删除只包含空格的行,请使用
resultString = Regex.Replace(subjectString, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);
^\s+$
将删除从第一个空行到最后一个空行(在连续的空行块中)的所有内容,包括仅包含制表符或空格的行
[\r\n]*
然后将删除最后一个CRLF(或者只删除LF,这很重要,因为.NET正则表达式引擎在\r
和\n
之间匹配$
,非常有趣) 不适合我。我得换一点,但是谢谢
呃#正则表达式。。我不得不再换一次,但这很好:
private string RemoveEmptyLines(string lines)
{
return Regex.Replace(lines, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd();
}
例如:
此模式非常适用于删除空行和只有空格和/或制表符的行
s = Regex.Replace(s, "^\s*(\r\n|\Z)", "", RegexOptions.Multiline)
我找到了这个问题的简单答案:
YourradTextBox.Lines = YourradTextBox.Lines.Where(p => p.Length > 0).ToArray();
根据Marco Minerva[MCPD]在上的改编,我编写了这个扩展方法,它还使用TrimEnd(TrimNewLineChars)修剪最后一个(过时的)换行符:
我尝试了前面的答案,但其中一些与正则表达式不工作的权利
如果使用正则表达式查找空行,则不能将其用于删除
因为它将删除非空行的“中断行”
您必须使用“正则表达式组”进行此替换
其他一些没有regex的答案可能会有性能问题
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();
}
这里提到的方法都没有一个对我有帮助,但我找到了一个解决办法
将文本拆分为行-字符串的集合(带或不带空字符串,也包括修剪()每个字符串)
将这些行添加到多行字符串
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);
}
public static IEnumerable SplitToLines(此字符串inputText,bool removemptylines=true)
{
如果(inputText==null)
{
屈服断裂;
}
使用(StringReader=新StringReader(inputText))
{
弦线;
而((line=reader.ReadLine())!=null)
{
if(removeMptylines&&!string.IsNullOrWhiteSpace(行))
屈服返回线。修剪();
其他的
屈服返回线。修剪();
}
}
}
公共静态字符串到MultilineText(此字符串文本)
{
var lines=text.SplitToLines();
返回string.Join(Environment.NewLine,lines);
}
在一代人之后删除这些行真的是你想要做的吗?我想你应该看看为什么要生成额外的行。如果您使用WriteLine(…)方法,它们将为您编写新行。Write(…)方法不会写入新的行序列。这不是我的错,我正在从一些文本文件中提取文本,这就是问题所在!谢谢,但这不是一个通用的解决方案,不包括标签、空格和诸如此类的东西。你的问题没有提到这一点。事实上,你特别说了“空行”。我也在上面钉了Trim()
。但是,它在\n\n\n
的情况下仍然不起作用。实际上,这并不能解决所有空行。我面临着一种情况,当我有可变数量的端点一起走。因此,在这种情况下,我们需要在文本中迭代多次。这几乎可以实现,但是我有一个问题:最后一行是空的,并且没有删除。我的正则表达式很差,所以我不知道为什么?@RobinRye:这是因为它至少需要一个空格字符来匹配。如果您将\s+
更改为\s*
,那么它也应该删除最后一行。谢谢Tim,我在研究了一点正则表达式后也这么认为,但没有帮助。已更改为\s*,但结果字符串中仍保留最后一行。我使用str.Trim()删除它。这也删除了最后一个空行:Regex.Replace(subjectString,@“[\r\n]*^\s*$[\r\n]*”,“”,RegexOptions.Multiline)@戴安娜:这可能有副作用。在某些情况下,许多“换行符”会使用此方法删除。请在此处添加说明您有性能问题。考虑用一个字符串100万来测试你的方法,里面有代码< > \n>代码>。考虑使用<代码> StringBuilder <代码>而不是+String,我认为调用函数ReaveVeleType更为合理。一个解释是,AppEdTrn在返回的字符串末尾追加一个空行。@ ToMas-Galigele,这是意图。“拆分”将从行的末尾删除换行符,因此您需要将其添加回,否则您的所有行都将变成一行!唯一的问题是Environment。换行符是一个字符串,无法放入字符数组。只有当所讨论的字符串来自同一个系统时,您的扩展才能工作。如果它在lnux、web到windows等系统之间传输,则根本无法工作。考虑将TrimeNexLARCARS转换为实际的ARARYI,我不知道你的意思。你可以发布一个无法工作的示例字符串,我将用它编写一个单元测试。谢谢。请在文本文件中试用它,其中的是CR+LF()、LF()和(经典,在Max OS X之前)(CR)。=ASCII 13。[LF]()=ASCII 10。这就是AaA暗示的Environment.NewLine
仅在使用当前系统的默认行结束顺序创建文件时有效。大多数高级文本编辑器都可以处理/设置/保存格式(通过右下角给定文件的隐藏功能(如“LF”)并在此处进行更改)。请在投票否决所有人之前仔细阅读问题。
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);
}
}
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();
}
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);
}