Подтвердить что ты не робот

Regex (С#): Замените \n на\r\n

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

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

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

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

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

4b9b3361

Ответ 1

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

[^\r]\n

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

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

([^\r]|$)\n

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

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

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

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

Ответ 2

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

(?<!\r)\n

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ chakrit дает также идти, но тогда вам нужно использовать регулярное выражение, но так как вы не говорите, что такое "myStr"...

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

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

Ответ 5

myStr.Replace("([^\r])\n", "$1\r\n");

$может потребоваться\

Ответ 6

Попробуйте следующее: Замените (Char.ConvertFromUtf32 (13), Char.ConvertFromUtf32 (10) + Char.ConvertFromUtf32 (13))

Ответ 7

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

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

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