Мне нужно разбить строку на новые строки в .NET, и единственный способ, которым я знаю разбиение строк, - это метод Split, Однако это не позволит мне (легко) расколоться на новой строке, так что это лучший способ сделать это?
Самый простой способ разделить строку на новые строки в .NET?
Ответ 1
Чтобы разбить на строку, вам нужно использовать перегрузку, которая принимает массив строк:
string[] lines = theText.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);
Edit:
Если вы хотите обрабатывать различные типы разрывов строк в тексте, вы можете использовать возможность сопоставить несколько строк. Это будет правильно разделено на любой тип разрыва строки и сохранить пустые строки и интервалы в тексте:
string[] lines = theText.Split(
new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None
);
Ответ 2
Используйте StringReader
:
using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
string line = reader.ReadLine();
}
Ответ 3
Вы можете легко разбить свою строку так:
aString.Split(Environment.NewLine.ToCharArray());
Ответ 4
Старайтесь не использовать string.Split для общего решения, потому что вы будете использовать больше памяти везде, где вы используете функцию - исходную строку и разделенную копию, как в памяти. Поверьте мне, что это может быть одной из проблем, когда вы начинаете масштабироваться - запустите 32-битное пакетное приложение, обрабатывающее 100 МБ документов, и вы сможете использовать восемь одновременных потоков. Не то, чтобы я был там раньше...
Вместо этого используйте итератор следующим образом:
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();
Ответ 5
На основании ответа Гуффа в классе расширения используйте:
public static string[] Lines(this string source) {
return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}
Ответ 6
Для строковой переменной s
:
s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)
Это использует определение среды для окончаний строки. В Windows окончание строк - CR-LF (возврат каретки, подача строки) или в escape-символы С# \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 это создаст один пустой строковый элемент для каждой новой строки.
Ответ 7
Regex также является опцией:
private string[] SplitStringByLineFeed(string inpString)
{
string[] locResult = Regex.Split(inpString, "[\r\n]+");
return locResult;
}
Ответ 8
Я просто подумал, что добавлю свои два бита, потому что другие решения по этому вопросу не попадают в классификацию кода для повторного использования и не удобны.
Следующий блок кода расширяет 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"
в качестве параметра разделителя.
Комментарий: было бы неплохо, если бы Microsoft реализовала эту перегрузку.
Ответ 9
В настоящее время я использую эту функцию (на основе других ответов) в 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
Ответ 10
Ну, на самом деле раскол должен делать:
//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]);
}
Ответ 11
string[] lines = text.Split(
Environment.NewLine.ToCharArray(),
StringSplitOptions.RemoveEmptyStrings);
Параметр RemoveEmptyStrings гарантирует, что у вас нет пустых записей из-за\n, следующих за \r
(Изменить, чтобы отражать комментарии:) Обратите внимание, что он также отбросит в тексте пустые строки. Обычно это то, что я хочу, но это может быть не ваше требование.
Ответ 12
Я не знал о Environment.Newline, но я думаю, это очень хорошее решение.
Моя попытка была бы:
string str = "Test Me\r\nTest Me\nTest Me";
var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();
Дополнительный .Trim удаляет любые \r или\n, которые могут быть все еще присутствуют (например, при работе с окнами, но разделяя строку символами os x newline). Вероятно, это не самый быстрый способ.
EDIT:
Как правильно отметили комментарии, это также удаляет любые пробелы в начале строки или перед новой подачей строки. Если вам нужно сохранить этот пробел, используйте один из других вариантов.
Ответ 13
Глупый ответ: напишите во временный файл, чтобы вы могли использовать почтенный
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
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
Очень просто, на самом деле.
VB.NET:
Private Function SplitOnNewLine(input as String) As String
Return input.Split(Environment.NewLine)
End Function
С#:
string splitOnNewLine(string input)
{
return input.split(environment.newline);
}