Я сделал что-то подобное в прошлом году.
Это было легко, вы начинаете с поиска последних (
, и вы храните индекс. Затем вы просматриваете первый )
после сохранения индекса. Вам просто нужна подстрока для извлечения текста между этими двумя указательными и сделал :)
Для следующего уровня, использовать предыдущий индекс для поиска предыдущего/следующей (
/)
и у вас есть простой парсер;)
Вот пример простого кода для печати каждого уровня:
public static void main(String... args) {
String s = "(This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.)";
searchInto(s);
}
public static void searchInto(String s){
searchInto(s, s.length(), 0);
}
public static void searchInto(String s, int from, int to){
int nextOpen = s.lastIndexOf("(", from-1);
if(nextOpen >= 0){
int nextClose = s.indexOf(")", to);
System.out.println(s.substring(nextOpen + 1, nextClose));
searchInto(s, nextOpen, nextClose + 1);
} else
return;
}
Напечатает:
This is level 3.
This is level 2. (This is level 3.) Back to level 2.
This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.
EDIT:
Это должно покрывать больше земли. Это будет искать внутренний блок AND и рядом друг с другом.
public static void main(String... args) {
searchInto("(This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.)");
searchInto("(L1) (L2) (L3)");
searchInto("(L1) (L2 (L2a)) (L3)");
}
public static void searchInto(String s){
searchInto(s, s, s.length(), 0);
}
public static void searchInto(String s, String original, int from, int to){
int nextOpen = s.lastIndexOf("(", from);
if(nextOpen >= 0){
int nextClose = s.indexOf(")", nextOpen);
String tmp = original.substring(nextOpen + 1, nextClose);
System.out.println(tmp); //Print the result, use a List to store or treat it directly.
s = s.substring(0, nextOpen) + "#" + s.substring(nextOpen + 1, nextClose) + "#" + s.substring(nextClose + 1);
searchInto(s, original, nextOpen - 1, nextClose + 1);
} else
return;
}
Выведет:
This is level 3.
This is level 2. (This is level 3.) Back to level 2.
This is level 1. (This is level 2. (This is level 3.) Back to level 2.) Back to level 1.
L3
L2
L1
L3
L2a
L2 (L2a)
L1
При использовании альтернативной строки для замены уже нашли характер, предотвратить код застрять по индексу. Но я печатаю значение из оригинала, чтобы напечатать правильное значение (без знака #
, который использовался для замены найденного ()
)
Это немного дороже, так что это действительно так, если вам нужно покрыть каждую структуру.
Вы хотите иметь возможность сопоставлять определенные уровни вложенных круглых скобок? Как обеспечить вложенный уровень и получить шаблон динамически? –
Какова ваша конечная цель, то есть какой вы хотите, чтобы ваш результат был? – NitroNbg
См. Https://ideone.com/RP76IO. Однако немного другой подход к определению уровня. –