Регулярное выражение (C #):Заменить на

StackOverflow https://stackoverflow.com/questions/31053

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Подойдет ли это?

[^\r]\n

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

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

([^\r]|$)\n

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

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

Редактировать: credit @Kibbee Использование look-ahead s явно лучше, поскольку оно не будет захватывать соответствующий предыдущий символ и также должно помочь в любых крайних случаях.Итак, вот лучшее регулярное выражение + код становится:

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

Другие советы

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

(?<!\r)\n

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

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

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

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

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

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

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

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

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

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

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

$ может потребоваться, чтобы это был \

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top