Использование регулярных выражений, это (кронштейн вложенности) делает можно сделать, но только до фиксированного уровня гнездования.
Ваше текущее регулярное выражение (немного изменился):
(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*((\{[^\{\}]*?\})|;)
только позволяет один уровень. Более конкретно, это та часть, которая соответствует его:
(\{[^\{\}]*?\})
Если вы хотите, чтобы соответствовать до двух уровней, изменить указанную часть к:
(\{([^{}]*|\{[^{}]*\})*\})
Таким образом:
(@Override[\n\s\t]*)?public *(abstract)? *void *[a-z]*\([a-z]* [^)]+\)[\n\\s\t]*(\{([^{}]*|\{[^{}]*\})*\}|;)
Чтобы добавить дополнительные уровни, вы должны продолжать редактирование. Это будет получить messier и messier, как вы добавляете уровни.
Объяснение:
\{
будет соответствовать первой открывающая скобка
(
открывает группу
[^{}]*
матчи ничего, кроме скобок
|
или
\{
, если он не найдет открывающую скобку ...
[^{}]*
... он будет соответствовать ничего, кроме кронштейна ...
\}
... до тех пор, пока не найдет закрывающую скобку
)
закрывает группы
*
выше группа может случиться ноль или более раз
\}
соответствует окончанию кронштейна
Чтобы добавить больше уровней, изменить средний (вторую) [^{}]*
части к ([^{}]*|\{[^{}]*\})*
.
Если вы не можете предсказать максимальный уровень вложенности:
Есть некоторые языки, которые позволяют оператору вложенности R
, что позволяет вам гнездовой произвольное количество уровней. Если ваш язык не поддерживает его (Java не делает, афаик PHP и Perl do), вам нужно либо:
- предсказывать максимальный уровень гнездования; ИЛИ
- самостоятельно создайте парсер.
Регулярные выражения, без оператора R
, не может гнездо произвольное количество уровней.
Тем не менее, с помощью оператора R
будет как таковой:
(\{([^{}]|(?R))*\})
Больше информации на this answer.
Инструменты распознавания синтаксиса, такие как JavaCC и ANTLR, вероятно подходят для вашей задачи –
, если у вас есть окончательное издание intellij idea, у них очень мощный инструмент поиска и замены структур, который делает именно то, что вам нужно. –
Вы также можете взглянуть на JDT API Eclipse. – SpaceTrucker