[РЕДАКТИРОВАТЬ: я оставил этот пост для информации о группах захвата, но основное решение, которое я дал, не было правильным.(?:START)((?:[^S]|S[^T]|ST[^A]|STA[^R]|STAR[^T])*)(?:END)
, как указано в комментариях, не будет работать;Я забыл, что игнорируемые символы не могут быть отброшены, и поэтому вам нужно что-то такое, как ... |STA(?![^R])|
, чтобы по-прежнему разрешать этому символу быть частью END, таким образом сбой чего-то такого, как STARTSTAEND;так что это явно лучший выбор;следующее должно показать правильный способ использования групп захвата ...]
Ответ, полученный с помощью оператора '?!' с нулевой шириной, с группами захвата: (?:START)((?!.*START).*)(?:END)
захватывает внутренний текст, используя $ 1 для замены.Если вы хотите, чтобы теги START и END были захвачены, вы можете сделать (START)((?!.*START).*)(END)
, что дает $ 1 = START $ 2 = текст и $ 3 = END или другие различные перестановки, добавляя / удаляя ()
s или ?:
s.
Таким образом, если вы используете его для поиска и замены, вы можете сделать что-то вроде BEGIN $ 1FINISH.Итак, если вы начали с:
abcSTARTdefSTARTghiENDjkl
, вы получите ghi
в качестве группы захвата 1, а замена на BEGIN $ 1FINISH даст вам следующее:
abcSTARTdefBEGINghiFINISHjkl
, что позволит вам менять токены START / END только при правильном сопряжении.
Каждый (x)
является группой, но я поставил (?:x)
для каждого из них, кроме середины, которая помечает его как группу без захвата;единственным, кого я оставил без ?:
, была середина;тем не менее, вы также можете получить токены BEGIN / END, если хотите переместить их или что-то еще.
См. документацию Java regex для получения полной информации о Javaрегулярные выражения.