Замінити перерви в рядку C #


512

Як я можу замінити перерви рядка в рядку на C #?


2
Скажіть, будь ласка, більше: що для вас "перерва лінії"? Чим ви хочете їх замінити?
Джей Базузі,

ха-ха. Я перевіряв те ж саме в java, коли я дізнався, що System.getProperty ("line.separator") цікаво дізнатись про колегу в C #. ваша посада допомогла мені.
Равіша

Відповіді:


715

Використовуйте заміну на Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

Як зазначалося в інших публікаціях, якщо рядок походить з іншого середовища (ОС), вам потрібно буде замінити реалізацію цих конкретних середовищ новими символами керування рядком .


8
По-перше, це не працювало для мене. Після деяких досліджень я знайшов рішення: мені довелося використовувати "за допомогою системи;" або "System.En Environmentment.NewLine"
Смолла

12
Не видалили всі символи нового рядка. Спробуйте цей рядок "\ n \ r \ nМоє повідомлення \ r \ n \ n \ r \ n це. \ N \ n \ r \ n"
Шакти Пракаш Сінгх

13
Взагалі мені таке рішення подобається. Однак зауважте, що навіть на одній ОС фактичні нові рядки можуть не збігатися. Це сталося зі мною, чому обробка повертає SQL. Нові рядки були \ n, тоді як Environment.NewLine був \ r \ n. Результатом було те, що нічого не підходило, тому нові лінії залишалися.
Dono

@Dono> звідки беруться дані SQL? Можливо, із зовнішнього джерела, що займається новими лініями UNIX шляхом. Це проблема з форматом даних, а не з ОС або цим методом ...
Лоран С.

Це має бути одним із статичних методів класу String. Сам .NET повинен мати можливість виявити формат розривів рядка у рядку та перетворити його у формат Environment.NewLine \ r \ n ...
Дін Куга

442

Розміщені досі рішення або лише замінюють, Environment.NewLineабо вони виходять з ладу, якщо рядок заміни містить розриви рядків, оскільки вони викликають string.Replaceкілька разів.

Ось рішення, яке використовує регулярний вираз, щоб зробити всі три заміни всього за один прохід по рядку. Це означає, що рядок заміни може безпечно містити розриви рядків.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
тож ваша приказка, що виконує Regex.Replace (введення, @ "[\ r \ n] +", substituString) не виконає те саме завдання?
вогник

7
@flamebaud Ні, це призведе до іншого результату, якщо є кілька розривів рядків підряд. "\ r \ n? | \ n" замінить кожен розрив рядка, тоді як "[\ r \ n] +" зробить одну заміну для будь-якої кількості розривів рядків.
Девід Хаммонд

Для тих, хто турбується про кілька перерв рядків: / (\ r \ n? | \ N) / gm
BobbyA

4
Це насправді правильне рішення, якщо ви хочете видалити розрив рядка в рядку, який може надходити з різних ОС. Хороший приклад - форматування JSON. +1
Бастієн Вандамме

1
Якщо дослівний рядок (@ префікс) не використовується, то вам потрібно мати два зворотні риски в рядку скрізь, де він використовується, тому відповідь від @mark_byers вище все ще правильна. Префікс @ робить його таким чином, що зворотна косою рисою є частиною рядка, який повинен бути, щоб Regex використовував його як символ втечі.
Кірк Лімохн

173

Щоб розширити відповідь The.Anyi.9, ви також повинні знати про різні типи розриву рядків у загальному користуванні . Залежно від того, звідки виник ваш файл, ви можете подивитися, переконавшись, що ви знайдете всі альтернативи ...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

Ви повинні піти ...


6
Спочатку мені більше сподобалось середовище, але якщо String не надходить із системи, на якій він працює, він не буде працювати. +1
Flo

1
НЕ Line.Replace("\n", replaceWith).Replace("\r", replaceWith);вистачає?
Thomas Ayoub

5
Ні, тому що якщо у вас є, \r\nви будете в кінцевому підсумку із заміною рядка двічі - не ідеально.
ZombieSheep

1
Вам не потрібні рядкові літерали? рядок RemoveBreaks = Line.Replace (@ "\ r \ n", substituWith) .Replace (@ "\ n", substituWith) .Replace (@ "\ r", substituWith);
Шон Дотей

2
@ShawnDotey не потрібно, ми хочемо замінити контрольні символи, а не послідовності зворотної косої риси та літери.
Н. Кудрявцев

38

Я б використовував Environment.Newline, коли хотів вставити нову рядок для рядка, але не видаляти всі нові рядки з рядка.

Залежно від вашої платформи, ви можете мати різні типи нових рядків, але навіть всередині однієї платформи часто використовуються різні типи нових рядків. Зокрема, при роботі з форматами файлів та протоколами.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

Це єдине, що працювало для мене, коли я хотів згорнути отриманий код веб-сторінки до одного рядка (для спрощення шаблонів регулярних виразів)
Paw Baltzersen

Повністю згоден з Брайаном Р. Бонді. Рішення, яке запропонував Корін і настільки прихильне, дуже наївне.
Каліфорнія

18

Якщо ваш код повинен працювати в різних середовищах, я б розглядав можливість використання Environment.NewLineконстанти, оскільки саме він newlineвикористовується в конкретному середовищі.

line = line.Replace(Environment.NewLine, "newLineReplacement");

Однак якщо ви отримуєте текст з файлу, що походить з іншої системи, це може бути не правильною відповіддю, і вам слід замінити будь-яку константу нового рядка, що використовується в іншій системі. Зазвичай це буде \nабо \r\n.


Вам потрібно перепризначити його до початкової змінної, оскільки заміна не відбувається на місці.
tvanfosson

@driss Мені хотілося б знати, як би ви вибрали правильну константу нового рядка, коли ви не знаєте, з якої системи вийшов файл ... це рішення справді здається універсальним.
Каліфорнія

14

Не забувайте, що заміна не робить заміну в рядку, але повертає нову рядок із заміненими символами. Далі буде видалено розриви рядків (не замінити їх). Я б використав метод @Brian R. Bondy, щоб замінити їх чимось іншим, можливо, обгорнутим як метод розширення. Не забудьте спочатку перевірити нульові значення, перш ніж викликати Замінити або надані методи розширення.

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

Як методи розширення:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}

не може бути ''в C # - немає такого поняття, як порожній знак. буде '\0'працювати замість цього?
Шевек

1
@Shevek - просто використав неправильні цитати. Напевно, я робив неабияку кількість JavaScript у той день, коли я відповів на це.
tvanfosson

@Califf - це рівнозначно, не краще.
tvanfosson

2
помилка, яку ви зробили тут, просто доводить, що це ЛЕПШЕ. Більшість компаній, над якими я працював, мають свій стандарт кодування - НЕ ВИКОРИСТОВУЮТЬ ЗАВДАННЯ ЛІТЕРАЛІВ.
Каліфорнія

2
@Califf "помилка", яку я зробив, не була б допущена в IDE з Intellisense і не була б складена. Якщо ви відчуваєте, що string.Emptyкраще, скористайтеся всіма силами.
tvanfosson

10

Щоб переконатися, що всі можливі способи розривів рядків (Windows, Mac і Unix) замінені, слід скористатися:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

і в цьому порядку, щоб не робити зайвих розривів рядків, коли ви знайдете комбінацію рядків, що закінчуються символами.


8

якщо ви хочете "очистити" нові рядки, коментар flamebaud за допомогою regex @"[\r\n]+"- найкращий вибір.

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}

Найкраща відповідь на заміну нових рядків у більшості випадків.
Шахбаз Ахмад

Дякуємо за цей корисний зразок коду. Мене виправили через цей ситнакс: Regex.Replace (str, @ "[\ r \ n] +", "-")
Седат Кумку

6

Мені потрібно було замінити \r\nфактичне повернення каретки та каналу лінії та замінити \tфактичним вкладкою. Тому я придумав таке:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}

6

Чому б не так?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

Примітка. Замініть strinна ім'я вхідного рядка.



2

Використовуйте метод .Replace ()

Line.Replace("\n", "whatever you want to replace with");

2

Найкращим способом безпечної заміни лінії є

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

яка повинна створювати рядок із лише \ n (наприклад, передача рядків) як розриви рядків. цей код також корисний для виправлення змішаних рядків.


2

Оскільки новий рядок може бути обмежений \n, \rі \r\n, спочатку ми замінимо \rі \r\nна\n , і тільки потім розбити рядок даних.

Наступні рядки повинні перейти до parseCSVметоду:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}

0
string s = Regex.Replace(source_string, "\n", "\r\n");

або

string s = Regex.Replace(source_string, "\r\n", "\n");

залежно від того, яким шляхом ви хочете піти.

Сподіваємось, що це допомагає.


0

Іншим варіантом є створення StringReaderнадмірного рядка. Щодо читача, зробіть .ReadLine()у циклі. Тоді ви розділите лінії, незалежно від того, які (послідовні чи непослідовні) роздільники вони мали. З цим ви можете продовжувати, як хочете; одна з можливостей - використовувати StringBuilderі дзвінок.AppendLine на нього.

Перевага полягає в тому, що ви дозволяєте рамці вирішувати, що являє собою "розрив лінії".


0

Якщо ви хочете замінити лише нові рядки:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

Якщо ви хочете замінити нові рядки, вкладки та пробіли:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.