C# удаление строки с использованием регулярного выражения, включая разрыв строки - PullRequest
2 голосов
/ 06 января 2020

Мне нужно удалить строки, которые соответствуют определенному шаблону из некоторого текста. Один из способов сделать это - использовать регулярное выражение с якорями начала / конца, например:

var re = new Regex("^pattern$", RegexOptions.Multiline);
string final = re.Replace(initial, "");

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

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

var re = new Regex(@"^pattern$(\r\n|\r|\n)?", RegexOptions.Multiline);
string final = re.Replace(initial, "");

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

1 Ответ

2 голосов
/ 07 января 2020

Для соответствия любой последовательности разрыва строки вы можете использовать шаблон (?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029]). Таким образом, вместо (\r\n|\r|\n)? вы можете использовать (?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029])?.

Подробности:

  • ‎000A - перевод строки, \n
  • ‎000B - строка табуляции char
  • ‎000C - строка перевода char
  • ‎000D - возврат каретки, \r
  • ‎0085 - следующая строка char, NEL
  • ‎2028 - символ разделителя строк - 2029 - символ разделителя абзацев.

Если вы хотите удалить любые 0+ не горизонтальные (или вертикальные) символы пробела после совпавшей строки, вы можете использовать [\s-[\p{Zs}\t]]*: любой пробел (\s), но (-[...]) горизонтальный пробел (соответствует [\p{Zs}\t]). Обратите внимание, что по какой-то причине \p{Zs} класс категории Unicode не соответствует символам табуляции.

Здесь необходимо рассмотреть еще один аспект, так как вы используете опцию RegexOptions.Multiline: она делает $ совпадением перед перевод строки (\n) или конец строки. Вот почему, если ваши строки заканчиваются на CRLF, шаблон может не совпадать. Следовательно, добавьте необязательный \r? перед $ в вашем шаблоне.

Итак, используйте

@"^pattern\r?$(?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029])?"

или

@"^pattern\r?$[\s-[\p{Zs}\t]]*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...