Regex (C #): заменить \ n на \ r \ n - PullRequest
       62

Regex (C #): заменить \ n на \ r \ n

37 голосов
/ 27 августа 2008

Как я могу заменить одиночные экземпляры \ n на \ r \ n (только LF с CRLF), используя регулярное выражение в C #?

Извините, если это глупый вопрос, я новичок в Regex.

Я знаю, чтобы сделать это, используя план String.Replace, как:

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

Однако, это не элегантно и уничтожит все "\ r + \ r \ n" уже в тексте (хотя они вряд ли существуют).

Ответы [ 7 ]

60 голосов
/ 28 августа 2008

Это может быть быстрее, если вы используете это.

(?<!\r)\n

В основном он ищет любой \ n, которому не предшествует \ r. Скорее всего, это будет быстрее, потому что в другом случае почти каждая буква соответствует [^ \ r], поэтому она будет перехватывать это, а затем искать \ n после этого. В примере, который я привел, он остановится только тогда, когда найдет \ n, и перед этим они посмотрят, нашел ли он \ r

44 голосов
/ 27 августа 2008

Будет ли это делать?

[^\r]\n

В основном это соответствует '\ n', которому предшествует символ, который не является '\ r'.

Если вы хотите, чтобы он также обнаруживал строки, начинающиеся с единственного '\ n', попробуйте

([^\r]|$)\n

Что говорит о том, что оно должно соответствовать '\ n', но только те, которые являются первым символом строки или те, которые не предшествуют '\ r'

Могут быть особые случаи, чтобы проверить, так как вы возитесь с определением самих строк, '$' может работать не слишком хорошо. Но я думаю, вы должны понять.

РЕДАКТИРОВАТЬ: credit @Kibbee Использование упреждающего просмотра явно лучше, поскольку оно не захватывает совпадающий предшествующий символ и должно помочь в любых крайних случаях. Итак, вот лучшее регулярное выражение + код становится:

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
12 голосов
/ 23 июня 2011

Я пытался сделать приведенный ниже код для строки, и она не работала.

myStr.Replace("(?<!\r)\n", "\r\n")

Я использовал Regex.Replace, и он работал

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
3 голосов
/ 27 августа 2008

Я предполагаю, что "myStr" - это объект типа String, в этом случае это не регулярное выражение. \ r и \ n являются эквивалентами для CR и LF.

Мое лучшее предположение, что если вы знаете, что у вас есть \ n для КАЖДОЙ строки, несмотря ни на что, то сначала вы должны удалить каждую \ r. Затем замените все \ n на \ r \ n.

Ответ, который дает Чакрит, тоже будет идти, но тогда вам нужно использовать регулярное выражение, но поскольку вы не говорите, что такое «myStr» ...

Редактировать: рассмотрение других примеров говорит мне об одном: почему сложные вещи, когда вы можете сделать это легко ?, Поскольку есть регулярное выражение, не то же самое, что «должен использовать»: D

Edit2: инструмент очень полезен, когда вы играете с регулярными выражениями, xpath и всем остальным, что дает вам странные результаты. Могу я указать вам: http://www.regexbuddy.com/

1 голос
/ 26 июля 2014

Если я знаю, что окончание строки должно быть одним из CRLF или LF, что-то, что мне подходит, это

myStr.Replace("\r?\n", "\r\n");

По сути, это тот же самый ответ neslekkiM , за исключением того, что он выполняет только одну операцию замены строки, а не две. Это также совместимо с движками Regex, которые не поддерживают негативные взгляды и обратные ссылки.

1 голос
/ 05 августа 2011

Попробуйте это: заменить (Char.ConvertFromUtf32 (13), Char.ConvertFromUtf32 (10) + Char.ConvertFromUtf32 (13))

1 голос
/ 27 августа 2008
myStr.Replace("([^\r])\n", "$1\r\n");

$, возможно, должен быть \

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...