В C#, что лучший способ состоит в том, чтобы удалить пустые строки т.е. строки, которые содержат только пробел от строки? Я рад использовать Regex, если это - лучшее решение.
Править: Я должен добавить, что использую.NET 2.0.
Обновление щедрости: я буду откатывать это после того, как щедрость будет награждена, но я хотел разъяснить несколько вещей.
Во-первых, любой Perl 5 compat regex будет работать. Это не ограничено разработчиками.NET. Заголовок и теги были отредактированы для отражения этого.
Во-вторых, в то время как я дал быстрый пример в деталях щедрости, это не единственный тест, который необходимо удовлетворить. Ваше решение должно удалить все строки, которые состоят из только пробела, а также последней новой строки. Если существует строка, которая, после пробежки Вашего regex, заканчивается "/r/n" или любыми пробельными символами, это перестало работать.
Если вы хотите удалить строки, содержащие любые пробелы (табуляции, пробелы), попробуйте:
string fix = Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline);
Изменить (для @Will): простейшим решением для обрезки завершающих символов новой строки было бы использовать TrimEnd
в результирующая строка, например:
string fix =
Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline)
.TrimEnd();
string corrected =
System.Text.RegularExpressions.Regex.Replace(input, @"\n+", "\n");
Я выберу:
public static string RemoveEmptyLines(string value) {
using (StringReader reader = new StringReader(yourstring)) {
StringBuilder builder = new StringBuilder();
string line;
while ((line = reader.ReadLine()) != null) {
if (line.Trim().Length > 0)
builder.AppendLine(line);
}
return builder.ToString();
}
}
string outputString;
using (StringReader reader = new StringReader(originalString)
using (StringWriter writer = new StringWriter())
{
string line;
while((line = reader.ReadLine()) != null)
{
if (line.Trim().Length > 0)
writer.WriteLine(line);
}
outputString = writer.ToString();
}
Другой вариант: используйте класс StringReader
. Преимущества: один проход по строке, не создает промежуточных массивов.
public static string RemoveEmptyLines(this string text) {
var builder = new StringBuilder();
using (var reader = new StringReader(text)) {
while (reader.Peek() != -1) {
string line = reader.ReadLine();
if (!string.IsNullOrWhiteSpace(line))
builder.AppendLine(line);
}
}
return builder.ToString();
}
Примечание. Метод IsNullOrWhiteSpace
является новым в .NET 4.0 . Если у вас его нет, просто написать самостоятельно:
public static bool IsNullOrWhiteSpace(string text) {
return string.IsNullOrEmpty(text) || text.Trim().Length < 1;
}
s = Regex.Replace(s, @"^[^\n\S]*\n", "");
[^\n\S]
соответствует любому символу, который не является символом перевода строки или символом, не являющимся пробелом - таким образом, любой символ пробела, кроме \n
. Но, скорее всего, единственными символами, о которых вам нужно беспокоиться, являются пробел, табуляция и возврат каретки, так что это тоже должно работать:
s = Regex.Replace(s, @"^[ \t\r]*\n", "");
А если вы хотите, чтобы он отлавливал последнюю строку без завершающего символа перевода строки:
s = Regex.Replace(s, @"^[ \t\r]*\n?", "");
Попробуйте это.
string s = "Test1" + Environment.NewLine + Environment.NewLine + "Test 2";
Console.WriteLine(s);
string result = s.Replace(Environment.NewLine, String.Empty);
Console.WriteLine(result);
с моей головы...
string fixed = Regex.Replace(input, "\s*(\n)","$1");
превращает это:
fdasdf asdf [tabs] [spaces] asdf
в это:
fdasdf asdf asdf
char[] delimiters = new char[] { '\r', '\n' };
string[] lines = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
string result = string.Join(Environment.NewLine, lines)
Использование LINQ:
var result = string.Join("\r\n",
multilineString.Split(new string[] { "\r\n" }, ...None)
.Where(s => !string.IsNullOrWhitespace(s)));
Если вы имеете дело с большими входными данными и / или несогласованными окончаниями строк, вам следует использовать StringReader и вместо этого выполнить описанную выше старую школу с циклом foreach.