Замена строк в пределах 2 строк в регулярном выражении

#regex #groovy

#регулярное выражение #groovy

Вопрос:

У меня есть строка:

 dkj   a  *  amp;     amp;*(amp;(*(
//#HELLO
^%@amp;UJNWDUK()C*(v 8*J DK*9
//#HE#$^amp;amp;(akls#$98akdjl ak#@sjdkja
//
%^amp;*(//#HELLO//#BYE<><>
//#BYE
^%@amp;UJNWDUK()C*(v 8*J DK*90K )
//#HELLO
amp;*^J$XUK  8j8 j jk kk8(amp;*(
//#BYE
  

и мне нужно иметь 2 группы, например, каждая группа должна начинаться с //HELLO, затем должна быть следующая строка, и за ней может следовать любой тип текста (.*), но он будет заканчиваться //BYE, которому предшествует строка:

 1)
//#HELLO
^%@amp;UJNWDUK()C*(v 8*J DK*9
//#HE#$^amp;amp;(akls#$98akdjl ak#@sjdkja
//
%^amp;*(//#HELLO//#BYE<><>
//#BYE

2)
//#HELLO
amp;*^J$XUK  8j8 j jk kk8(amp;*(
//#BYE
  

и заменяет исходную строку на эту: (в основном добавляя // к каждой строке каждой группы)

 dkj   a  *  amp;     amp;*(amp;(*(
////#HELLO
//^%@amp;UJNWDUK()C*(v 8*J DK*9
////#HE#$^amp;amp;(akls#$98akdjl ak#@sjdkja
////
//%^amp;*(//#HELLO//#BYE<><>
////#BYE
^%@amp;UJNWDUK()C*(v 8*J DK*90K )
////#HELLO
//amp;*^J$XUK  8j8 j jk kk8(amp;*(
////#BYE
  

Вот мой текущий прогресс:
У меня есть

 //#HELLOn.*?//#BYE[n$]
  

Однако я не уверен, как приступить к замене, я думаю о разделении каждой строки на группу с помощью G после //#HELLO и заканчивая //#BYE

Комментарии:

1. для начала вы на самом деле не ЗАДАЛИ вопрос. Я предполагаю, что вам нужна помощь с регулярным выражением. Но это не сайт «выполняю свою работу бесплатно», поэтому не могли бы вы опубликовать свой текущий прогресс и указать, с чем вам нужна помощь? Не могли бы вы конкретно сформулировать свои вопросы?

2. Извините, забыл добавить, что

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

4. НЕВАЖНО, всех, кого я решил переместить с помощью итерационного подхода

Ответ №1:

Это немного сложно, но это сделает это:

Поиск: (?m)(//#HELLO[rn] |G(?://#BYE|(?=(?:[^#]|#(?!HELLO[rn] ))*#BYE)[^rn]*[rn]*))

Заменить: //$1

В Groovy:

 String resultString = subjectString.replaceAll(/(?m)(//#HELLO[rn] |G(?://#BYE|(?=(?:[^#]|#(?!HELLO[rn] ))*#BYE)[^rn]*[rn]*))/, '//$1');
  

Комментарии:

1. Привет, Луис, немного похоже на твой вчерашний вопрос, но не то же самое… Дайте мне знать, если это сработает для вас. 🙂

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

Ответ №2:

Для группировки в отдельные строки используйте следующее регулярное выражение:

 //#HELLOr(.*[nr] )*//#BYEr?
  
  • r — Символ новой строки
  • [nr] — Ввод символов
  • *? — Не жадное совпадение
  • ? — Совпадение 1 или 0 раз

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

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

Комментарии:

1. Вы, вероятно, хотите что-то вроде rn?|n для новых строк.