#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
для новых строк.