我需要在.NET中将字符串拆分为换行符,我知道拆分字符串的唯一方法是使用Split方法。然而,这将不允许我(轻松)拆分换行,那么最好的方法是什么?
答案 0 :(得分:1254)
要拆分字符串,您需要使用带有字符串数组的重载:
string[] lines = theText.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);
编辑:
如果要在文本中处理不同类型的换行符,可以使用匹配多个字符串的功能。这将在任一类型的换行符上正确分割,并在文本中保留空行和间距:
string[] lines = theText.Split(
new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None
);
答案 1 :(得分:98)
使用StringReader
怎么样?
using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
string line = reader.ReadLine();
}
答案 2 :(得分:42)
你应该可以很容易地分割你的字符串,如下所示:
aString.Split(Environment.NewLine.ToCharArray());
答案 3 :(得分:24)
尽量避免使用string.Split作为一般解决方案,因为在使用该函数的任何地方都会使用更多内存 - 原始字符串和拆分副本都在内存中。请相信我,当你开始扩展时,这可能是一个问题 - 运行一个处理100MB文档的32位批处理应用程序,并且你将在8个并发线程中废弃。不是说我以前去过那里......
相反,使用像这样的迭代器;
public static IEnumerable<string> SplitToLines(this string input)
{
if (input == null)
{
yield break;
}
using (System.IO.StringReader reader = new System.IO.StringReader(input))
{
string line;
while( (line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
这将允许您围绕数据执行更高效的内存循环;
foreach(var line in document.SplitToLines())
{
// one line at a time...
}
当然,如果你想要全部都在内存中,你可以这样做;
var allTheLines = document.SplitToLines.ToArray();
答案 4 :(得分:23)
根据Guffa的回答,在扩展类中,使用:
public static string[] Lines(this string source) {
return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}
答案 5 :(得分:8)
对于字符串变量s
:
s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)
这将使用您环境对行结尾的定义。在Windows上,行结尾是CR-LF(回车,换行)或C#的转义字符\r\n
。
这是一个可靠的解决方案,因为如果您使用String.Join
重新组合这些行,则这等于您的原始字符串:
var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);
什么不该做:
StringSplitOptions.RemoveEmptyEntries
,因为这会打破Markdown等标记,其中空行具有句法用途。new char[]{Environment.NewLine}
,因为在Windows上,这将为每个新行创建一个空字符串元素。答案 6 :(得分:7)
正则表达式也是一种选择:
private string[] SplitStringByLineFeed(string inpString)
{
string[] locResult = Regex.Split(inpString, "[\r\n]+");
return locResult;
}
答案 7 :(得分:6)
我只是想加上我的两位,因为这个问题的其他解决方案不属于可重复使用的代码分类,并且不方便。
以下代码块扩展了string
对象,以便在使用字符串时它可以作为一种自然方法使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.ObjectModel;
namespace System
{
public static class StringExtensions
{
public static string[] Split(this string s, string delimiter, StringSplitOptions options = StringSplitOptions.None)
{
return s.Split(new string[] { delimiter }, options);
}
}
}
您现在可以使用任何字符串中的.Split()
函数,如下所示:
string[] result;
// Pass a string, and the delimiter
result = string.Split("My simple string", " ");
// Split an existing string by delimiter only
string foo = "my - string - i - want - split";
result = foo.Split("-");
// You can even pass the split options parameter. When omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);
要拆分换行符,只需将"\n"
或"\r\n"
作为分隔符参数传递。
评论: 如果微软实施了此次过载,那就太好了。
答案 8 :(得分:4)
我目前在VB.NET中使用此功能(基于其他答案):
Private Shared Function SplitLines(text As String) As String()
Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None)
End Function
它首先尝试拆分平台本地换行符,然后回退到每个可能的换行符。
到目前为止我只在一个班级里面需要这个。如果这发生了变化,我可能会将其Public
并将其移动到实用程序类,甚至可能使其成为扩展方法。
以下是如何将这些行重新连接起来,以获得良好的衡量标准:
Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
Return String.Join(Environment.NewLine, lines)
End Function
答案 9 :(得分:2)
嗯,实际上拆分应该这样做:
//Constructing string...
StringBuilder sb = new StringBuilder();
sb.AppendLine("first line");
sb.AppendLine("second line");
sb.AppendLine("third line");
string s = sb.ToString();
Console.WriteLine(s);
//Splitting multiline string into separate lines
string[] splitted = s.Split(new string[] {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
// Output (separate lines)
for( int i = 0; i < splitted.Count(); i++ )
{
Console.WriteLine("{0}: {1}", i, splitted[i]);
}
答案 10 :(得分:1)
string[] lines = text.Split(
Environment.NewLine.ToCharArray(),
StringSplitOptions.RemoveEmptyStrings);
RemoveEmptyStrings 选项将确保您没有空条目,因为\ n后面的\ n (编辑以反映评论:)请注意,它也会丢弃文本中的真正空行。这通常是我想要的,但可能不是你的要求。
答案 11 :(得分:0)
我不知道Environment.Newline,但我想这是一个非常好的解决方案。
我的尝试本来是:
string str = "Test Me\r\nTest Me\nTest Me";
var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();
附加的.Trim删除任何可能仍然存在的\ r或\ n(例如,在Windows上但是使用os x换行符分割字符串时)。可能不是最快的方法。
编辑:
正如评论正确指出的那样,这也会删除行开头或新换行符之前的任何空格。如果需要保留该空格,请使用其他选项之一。
答案 12 :(得分:0)
这里的示例很棒,并帮助我应对当前的“挑战”,以更可读的方式拆分RSA密钥。基于Steve Coopers解决方案:
string Splitstring(string txt, int n = 120, string AddBefore = "", string AddAfterExtra = "")
{
//Spit each string into a n-line length list of strings
var Lines = Enumerable.Range(0, txt.Length / n).Select(i => txt.Substring(i * n, n)).ToList();
//Check if there are any characters left after split, if so add the rest
if(txt.Length > ((txt.Length / n)*n) )
Lines.Add(txt.Substring((txt.Length/n)*n));
//Create return text, with extras
string txtReturn = "";
foreach (string Line in Lines)
txtReturn += AddBefore + Line + AddAfterExtra + Environment.NewLine;
return txtReturn;
}
只需提供一个33个字符宽度的RSA密钥,然后引号即可
Console.WriteLine(Splitstring(RSAPubKey, 33, "\"", "\""));
输出:
希望有人发现它有用...
答案 13 :(得分:-1)
愚蠢的回答:写一个临时文件,这样你就可以使用古老的了
File.ReadLines
var s = "Hello\r\nWorld";
var path = Path.GetTempFileName();
using (var writer = new StreamWriter(path))
{
writer.Write(s);
}
var lines = File.ReadLines(path);
答案 14 :(得分:-1)
using System.IO;
string textToSplit;
if (textToSplit != null)
{
List<string> lines = new List<string>();
using (StringReader reader = new StringReader(textToSplit))
{
for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
lines.Add(line);
}
}
}
答案 15 :(得分:-3)
实际上很简单。
VB.NET:
Private Function SplitOnNewLine(input as String) As String
Return input.Split(Environment.NewLine)
End Function
C#:
string splitOnNewLine(string input)
{
return input.split(environment.newline);
}