Для этого я предоставляю два конкретных c метода, которые могут быть полезны для других вещей, кроме этой конкретной задачи.
Первый метод - это метод bracketsMaxDepth () , который возвращает глубину конкретной вложенной скобки. Поддерживаемые скобки (), [], {}, <>
. Интересующие вас скобки - это фигурные скобки ( {} ).
Второй метод - это getNestedBracketedGroups () метод, который будет анализировать (извлекать) содержимое групп вложенных скобок внутри строки в квадратных скобках и возвращает содержимое этих групп в одномерном (1D) массиве строк. Поддерживаемые скобки: (), [], {}, <>
. Интересующие вас скобки - это фигурные скобки ( {} ).
bracketsMaxDepth () метод используется внутри getNestedBracketedGroups () для внутреннего использования. метод. Например, для разбора следующей строки:
String line = "1:{O:{o1,Brasil,F1,G2,E1}," +
"G:{g1,Germany,D2,V2,F1,G2,E1}," +
"N:{n1,Albania,D2,V2,R2,E1,A2}}";
мы можем сделать что-то вроде этого (я добавил дополнительное существо для тестирования):
String line = "1:{O:{o1,Brasil,F1,G2,E1},G:{g1,Germany,D2,V2,F1,G2,E1},N:{n1,Albania,D2,V2,R2,E1,A2}}";
line = line.trim();
// Get player Number
String player = line.substring(0, line.indexOf(":"));
// Is the player a string representation of a integer number?
if (!player.matches("\\d+")) {
// Nope...exit
return; // or whatever exit mechanism you need to use.
}
int playerNumber = Integer.parseInt(player);
// Get Player's Creatures...
String[] playerCreatures = getNestedBracketedGroups(line, 1, "{}",
true)[0].split(",(?![^\\{\\}]*\\})");
// Display creatures data
System.out.println("Creatures for Player #" + playerNumber);
for (int i = 0; i < playerCreatures.length; i++) {
String creat = playerCreatures[i];
int creatureNumber = i + 1;
String creatureType= creat.substring(0, creat.indexOf(":"));
// Get creature Attributes
String[] creatureAttributes = creat.substring((creatureType + ":").length() + 1,
creat.length() - 1).split("\\s{0,},\\s{0,}");
System.out.println("\tCreature #" + creatureNumber);
System.out.println("\t\tCreature Type: " + creatureType);
for (int j = 0; j < creatureAttributes.length; j++) {
System.out.println("\t\t\tAttribute #" + (j + 1) + ": " + creatureAttributes[j]);
}
}
Анализируемый вывод в Окно консоли будет выглядеть следующим образом:
Creatures for Player #1
Creature #1
Creature Type: O
Attribute #1: o1
Attribute #2: Brasil
Attribute #3: F1
Attribute #4: G2
Attribute #5: E1
Creature #2
Creature Type: G
Attribute #1: g1
Attribute #2: Germany
Attribute #3: D2
Attribute #4: V2
Attribute #5: F1
Attribute #6: G2
Attribute #7: E1
Creature #3
Creature Type: N
Attribute #1: n1
Attribute #2: Albania
Attribute #3: D2
Attribute #4: V2
Attribute #5: R2
Attribute #6: E1
Attribute #7: A2
Метод bracketsMaxDepth () :
<code>/**
* This method takes a string and returns the maximum depth of nested
* brackets. The bracket type to check the depth for is supplied within the
* bracketType parameter.<br><br>
*
* @param bracketedString (String) The string to process.<br>
*
* @param bracketType (String - Default is "()") Either a open bracket,
* or a close bracket, or both open and closed
* brackets can be supplied (no white-spaces). This
* method will process any <b>one</b> of 4 different
* bracket types and they are as follows:<pre>
*
* () Parentheses (Default)
* {} Curly Braces
* [] Square Brackets
* <> Chevron Brackets
* * @return (Integer) максимальная глубина поставляемого типа кронштейна. 0 возвращается *, если в поставляемой * строке нет скобок типа, указанного. -1 возвращается, если есть дисбаланс * в поставляемой строке указанного типа скобок. Для каждой открытой * скобки должна быть закрывающая скобка и наоборот. * / publi c stati c int bracketsMaxDepth (String bracketedString, String ...cketType) {char open = '('; // По умолчанию char close = ')'; // По умолчанию if (BrackType.length> 0) {String bType = Character.toString (BrackType [0] .charAt (0)); switch (bType) {case "(": case ")": open = '('; close = ')'; перемена; case "{": case "}": open = '{'; close = '}'; перемена; case "[": case "]": open = '['; close = ']'; перемена; case "<": case ">": open = '<'; close = '>'; перемена; по умолчанию: выбросить новое IllegalArgumentException ("\ nbracketsMaxDepth () Ошибка метода! \ n" + "Указан неизвестный тип скобок (" + bType + ")! \ n"); }} int current_max = 0; // текущий счет int max = 0; // общее максимальное количество int n = bracketedString.length (); char [] c = bracketedString.toCharArray (); // Обходим входную строку для (int i = 0; i max) {max = current_max; }} иначе if (c [i] == закрыть) {if (current_max> 0) {current_max--; } else {return -1; }}} // наконец проверяем несбалансированную строку if (current_max! = 0) {return -1; } return max; }
Метод getNestedBracketedGroups () :
<code>/**
* This method will parse out (retrieve) the contents of nested brackets
* groups within a bracketed string and return those group contents within a
* 1D String Array. The best way to see how this works is by examples. Let's
* say we have the following bracketed string:
* <pre>
*
* String a = "1(2(3)(4))(5(6)(7))";
*
* В приведенной выше строке мы Можно видеть, что есть два экземпляра групп уровня 1 * в скобках, которые в каждой группе уровня 1 вкладывают еще две группы уровня 2 * в скобках: *
*
* Level 1 Level 2
* (2(3)(4)) (3) (4)
*
* ==================================
*
* Level 1 Level 2
* (5(6)(7)) (6) (7)
*
* Группы в скобках: (2 (3 ) (4)) и (5 (6) (7)) оба * считаются находящимися на уровне гнезда 1 (уровень 1 - самый внешний уровень). Они * являются отдельными группами, потому что у них обоих есть свой набор внешних * скобок. В каждой группе уровня 1 у нас есть два набора групп * уровня в скобках * (всего 4 группы уровня 2), которые состоят из: (3) & * (4) и (6) & * (7) .
*
* Этот метод также использует StringUtils TokenJar .BracketsMaxDepth () * метод. * * @param bracketedString (String) Строка, содержащая * заключенный в скобки контент для анализа.
* * @param wantedDepth (Integer) По умолчанию 0 (полная глубина). * Вложенная глубина для извлечения содержимого в скобках * из.
Если указанная глубина скобки * глубже, чем то, что содержится в * входной строке, то IllegalArgu- * mentException выдается, объясняя как * такой , * * @paramcketType (String) Вы должны указать тип скобки для * обработки. Это можно сделать, указав * одну открывающую или закрывающую скобку или обе открытые * и закрывающие скобки, например, любая из * следующих допустимых записей, если * требуются скобки:
*
* "(" ")" "()" ")("
* * Any может поставляться один из четырех (4) типов кронштейнов. Допустимые скобки * Типы: *
*
* () Parentheses
* {} Curly Braces
* [] Square Brackets
* <> Chevron Brackets
* * @param removeOuterBrackets (Необязательно - Boolean - Значение по умолчанию - false). По умолчанию внешние скобки для каждой найденной * группы также прикрепляются к возвращенным * результатам. Если для этого необязательного * параметра задано значение true, внешние скобки удаляются * из возвращенных результатов группы.
* * @return (1D String Array) Требуются определенные вложенные группы.
* * @throws IllegalArgumentException, если a глубина указана больше, чем * доступная глубина в квадратных скобках *, содержащаяся в предоставленной входной строке. Это * исключение также генерируется, если обнаруживается *, что указанный тип скобки * несбалансирован (открытые и закрытые скобки * неправильно спарены) в пределах входной * входной строки. * / publi c stati c String [] getNestedBracketedGroups (String bracketedString, int requiredDepth, String bracketType, boolean ... removeOuterBrackets) {boolean removeOuter = false; if (removeOuterBrackets.length> 0) {removeOuter = removeOuterBrackets [0]; } int d = bracketsMaxDepth (bracketedString, rackType); if (requiredDepth == 0) {// По умолчанию для этого метода 0 (полная глубина). требуемая глубина = 1; } if (d == -1) {// Бросить исключение ... throw new IllegalArgumentException ("\ n \ ngetNestedBracketedGroups () Ошибка метода! \ n" + "Несоответствие скобок в предоставленной строке! \ n"); } else if (d ": open = '<'; close = '>'; перемена; по умолчанию: throw new IllegalArgumentException ("\ ngetNestedBracketedGroups () Ошибка метода! \ n" + "Указан неизвестный тип скобок (" + bType + ")! \ n"); } List list = new ArrayList <> (); int n = bracketedString.length (); char [] c = bracketedString.toCharArray (); int глубина = 0; String strg = ""; for (int i = 0; i = требуемая глубина)) {если (c [i] == закрыть) {глубина--; } strg + = Character.toString (c [i]); if (глубина <требуемая глубина) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); strg = ""; } Продолжить; } if (c [i] == close) {глубина--; } if (! strg.equals ("")) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); strg = ""; }} if (! strg.equals ("")) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); // + Character.toString (close)); } // (красный (синий)) серый ((оранжевый) зеленый) return list.toArray (new String [list.size ()]); } </code>