Хобрук: Ваш путь к мастерству в программировании

Regex удалить последнюю новую строку

Учитывая следующую строку с разделителями ;


a;; z
toy;d;hh 
toy
;b;;jj
z;
d;23
d;23td
;;io;
b y;b;12
z
a;b;bb;;;34
z

и это регулярное выражение

^(?!(?:(a|d))(?:;|$)).*(\s*\z|$)\R*

Я ищу, чтобы получить полные строки, чей 1st. столбец не a или d, и удалить совпадающие строки, чтобы получить это, после замены пустым

a;; z
d;23
d;23td
a;b;bb;;;34

См. демонстрацию.

В панели Замены есть 5-я пустая строка, которую нужно удалить.

Я использовал этот \s*\z в прошлом для этой цели. Как реализовано здесь, это, похоже, не работает.

Любая помощь приветствуется

09.05.2020

Ответы:


1

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

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

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

регулярное выражение (разрывы строк для удобства чтения):

((?!(a|d)).*(\s*\z|$)\R*)*
(^(a|d).*(?(?=\R*(.*\s*\R+)*(a|b))\R))
((?!(a|d)).*(\s*\z|$)\R*)*

заменить на $4 -->

a;; z
d;23
d;23td
a;b;bb;;;34

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

Логическая разбивка частей:

(?(?=\R*(.*\s*\R+)*(a|b))\R) является условным, он соответствует новой строке \R только в том случае, если (?) за ней следуют (?=) любые несоответствующие строки (.*\s*\R+)*, которые заканчиваются новой строкой, за которой следует (a|b).

Средняя часть (^(a|d).*(?(?=\R*(.*\s*\R+)*(a|b))\R)), содержащая это, становится замещающей группой $4. Таким образом, он соответствует строкам, начинающимся с (a|d), и все совпадения, кроме последнего, также соответствуют новой строке в конце их строки.

Начало и конец регулярного выражения ((?!(a|d)).*(\s*\z|$)\R*)* точно такие же и соответствуют всем ненужным вещам, поэтому они удаляются.

09.05.2020

2

Вы можете сопоставить то, что хотите удалить, и зафиксировать в группе то, что хотите сохранить.

Чтобы предотвратить удаление последовательностей новой строки между группами захвата, вы можете использовать предложение if (? для соответствия только последовательностям новой строки 0+ unicode, когда больше нет следующей строки, начинающейся с [ad];

В качестве замены используйте группу 1 $1

^(?:(?![ad];).*\R*)*|^([ad];.*(?:\R[ad];.*)*)(?(?![\s\S]*\R[ad];)\R*)

Пояснение

  • ^ Начало строки
  • (?: Non capture group
    • (?![ad];) If the line does not start with a or d followed by ;
    • .*\R* Соответствует всей строке и 0+ раз последовательности новой строки Unicode
  • )* Закройте группу и повторите 0+ раз, чтобы сопоставить все последовательные строки
  • | Or
  • ^ Начало строки
  • ( Capture group 1
    • [ad];.* Match a or d followed by ; and the rest of the line
    • (?: Non capture group
      • \R[ad];.* Match newline, a or d followed by ; and the rest of the line
    • )* Закройте группу и повторите 0+ раз, чтобы сопоставить все последовательные строки
  • ) Закрыть группу 1
  • (? If clause, only match a unicode newline sequence if the [ad]; pattern does not occur anymore
    • (?! Negative lookahead, assert what follows is not
      • [\s\S]*\R[ad]; Match the [ad]; pattern
    • ) Закрыть прогноз.
    • \R* Если утверждение истинно, соответствует 0+ последовательностям новой строки Unicode.
  • ) Закрыть предложение if

    См. демонстрацию регулярных выражений.

09.05.2020
Новые материалы

5 проектов на Python, которые нужно создать прямо сейчас!
Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

«Очень простой» эволюционный подход к обучению с подкреплением
В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..