C # как использовать Regex.Replace \ r \ n (фактические символы, а не разрыв строки)

У меня ужасный текст, который я очищаю с помощью нескольких регулярных выражений C #. Одна проблема, которая меня озадачила, заключается в том, что в тексте есть несколько строк '\ r \ n', фактические символы, а не разрывы строк.

Я пробовал:

content = Regex.Replace(content, "\\r\\n", "");

и:

content = Regex.Replace(content, "\r\n", "");

но ни один из них не работает. В итоге пришлось использовать:

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

чтобы завершить проект, но невозможность сделать это в регулярном выражении меня раздражает.


person Skrealin    schedule 30.11.2010    source источник
comment
может это помочь? stackoverflow.com/questions/1981947/   -  person SubniC    schedule 30.11.2010
comment
content.Replace (@ \ r \ n, \ r \ n) - ваш лучший выбор.   -  person VVS    schedule 30.11.2010
comment
@Jens: Конечно. Я хотел сказать, что это лучший выбор и намного лучше, чем использование регулярного выражения для такой тривиальной задачи.   -  person VVS    schedule 30.11.2010
comment
На этот вопрос ответили здесь, пожалуйста, проверьте и хорошее решение: stackoverflow.com/a/1982317/2208645   -  person Suraj Bhatt    schedule 10.12.2020


Ответы (7)


\r и \n также имеют особое значение в Regex, поэтому необходимо экранировать обратную косую черту. Затем эти обратные косые черты необходимо экранировать для строки C #, что приведет к

content = Regex.Replace(content, "\\\\r\\\\n", ""); 

or

content = Regex.Replace(content, @"\\r\\n", ""); 
person Jens    schedule 30.11.2010

Хорошая идея - выработать привычку использовать дословные строковые литералы (@"example") при написании регулярных выражений на C #. В этом случае вам понадобилось это:

content = Regex.Replace(content, @"\\r\\n", "\r\n");

В противном случае вам придется экранировать каждую обратную косую черту дважды: один раз, чтобы экранировать ее в строке C #, а затем второй раз, чтобы экранировать их для регулярного выражения. Таким образом, одна обратная косая черта превратилась бы в четыре обратной косой черты со стандартным строковым литералом.

person Mark Byers    schedule 30.11.2010

content = Regex.Replace(content, "\\\\r\\\\n", "");

может работать. Дополнительная информация здесь.

Цитировать:

В буквальных строках C #, а также в C ++ и многих других языках .NET обратная косая черта является escape-символом. Буквальная строка "\\" представляет собой одинарную обратную косую черту. В регулярных выражениях обратная косая черта также является escape-символом. Регулярное выражение \ соответствует одной обратной косой черте. Это регулярное выражение в виде строки C # становится "\\\\". Правильно: 4 обратной косой черты, чтобы соответствовать одной.

Примечание: мне пришлось написать 8 обратных косых черт в предпоследнем предложении, чтобы отображалось 4 обратных косых черты ;-)

person darioo    schedule 30.11.2010

Внутри указанной входной строки Regex.Replace заменяет строки, соответствующие шаблону регулярного выражения, указанной строкой замены.

Типичное использование будет

  string input = "This is   text with   far  too     much   " +  "   whitespace.";
  string pattern = "\\s+";
  string replacement = " ";
  Regex rgx = new Regex(pattern);
  string result = rgx.Replace(input, replacement);

Не похоже, что вы пытаетесь это сделать.

person Robin Maben    schedule 30.11.2010

Здесь есть лучший и простой ответ. У меня работает с использованием Regex.

public static string GetMultilineBreak(this string content)
{
    return Regex.Replace(content, @"\r\n?|\n", "<br>"); 
}
person Manjunath Bilwar    schedule 05.05.2017

Вопрос старый, но было изменение.

string temp = Regex.Replace(temp, "\\n", " ");

или достаточно лучше

string temp = Regex.Replace("tab    d_space  newline\n content here   :P", @"\s+", " ");
//tab d_space newline content here :P

Это работает с универсальными приложениями Windows и, возможно, с другими.

person Rohit Hazra    schedule 16.02.2016

Здесь дикая догадка:

var bslash = System.IO.Path.DirectorySeparatorChar.ToString();

content = content.Replace(bslash + "r" + bslash + "n", "");
person Rick Ratayczak    schedule 30.11.2010