[ID CC-CC2021] Найти строку, следующую за исключением предыдущей

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Всем здоровья!

Задача:
найти строку начинающуюся с #2
если, прежде нет строки начинающуюся с #1

Проблема:
пробовал, накидал несколько вариантов поисков.
что-то более или менее работает.
но варианты не работают в поиске текста №5
(строка предшествующая #2... начинается с //a...)
^([^#1])(^#2)(.+?$)
^(?!\#1)\r#2.+
^[^\#1]#2.+


Помогите пожалуйста с решением.
Всю ночь тестил, гуглил - не получилось.
Заранее большое спасибо!

PS
* abc/xyz - какой-то текст



Код:
------------- 1
text
#1
#2 xyz


------------- 2
text
#1 abc
#2 xyz


------------- 3
text
#1 abc




#2 xyz


------------- 4
text
#2 xyz


------------- 5
text
//a
#2 xyz


------------- 6
text
//a


#2 xyz


------------- 7
text//a


#2 xyz
 

vinnik63

Участник
Сообщения
322
Реакции
99
мне видится решение в два приёма:

Шаг 1) Найти все пары строк, где первая не имеет #1, а вторая начинается с #2:
(^(?!#1).*\r)(#2.*\r)
и заменить на то же самое, только перед #2 поставить любой символ (например пробел):
$1 $2

Шаг 2) Найти все строки, начинающиеся с пробела и #2 — это и будут искомые строки (только потом не забыть поубирать пробелы)
 
  • Спасибо
Реакции: blacksolg

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
мне видится решение в два приёма:

Шаг 1) Найти все пары строк, где первая не имеет #1, а вторая начинается с #2:
(^(?!#1).*\r)(#2.*\r)
и заменить на то же самое, только перед #2 поставить любой символ (например пробел):
$1 $2

Шаг 2) Найти все строки, начинающиеся с пробела и #2 — это и будут искомые строки (только потом не забыть поубирать пробелы)

У меня тоже была мысль решения в два приема:
раз
text //a #2 xyz
= "не работает"
а
text //a #2 xyz
= "работает"

- тогда отбить все #2... сверху одной строкой,
- применить r строкам #2... то что нужно (отбивка)
- после чистить-возвращать по необходимости добавленные строки на место (grep)

Но ваш @vinnik63 вариант более удобен

Правда...
(^(?!#1).*\r)(#2.*\r)
- находит в приведенном примере все строки #2 (за искл. где прежде нет #1...) - у меня такого не получилось с //a
- да, цепляет любую предыдущую строку
но запрос - походу, то что мне нужно:
для строк #2... (без #1...) могу теперь сделать отбивки
заменив результаты поиска на $1---$2 (--- - содержание отбивки)

Двойное вам спасибо @[B]vinnik63[/B] ! 'cooll)'