Регулярное выражение (C #):Заменить на
Вопрос
Как я могу заменить отдельные экземпляры на \ 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");
Это, по сути, делает то же самое неслеккиМответ за исключением того, что он выполняет только одну операцию замены строки, а не две.Это также совместимо с обработчиками регулярных выражений, которые не поддерживают отрицательные обратные ссылки.