У меня есть строка Q, и я хочу разделить ее на несколько частей. Например, я хотел бы иметь (ADD равным 1 и (EXP 1 4) равным 2 и так далее, расщепляясь после каждой круглой скобки, но при этом сохраняя форму строки.
String q =(("(ADD(EXP 1 4)(SQR 1)(DIV 34 77)(MULT 12 5 3 7)(Sub 1 2"));
Я пробовал делать это так, но не имел никакого успеха.
s[0]=q.indexOf("(");
s[1]=q.indexOf(")");
Следующие:
String q ="(ADD(EXP 1 4)(SQR 1)(DIV 34 77)(MULT 12 5 3 7)(Sub 1 2";
String[] result = q.split("(?=\\()");
выдает следующие строки в массиве результатов:
"(ADD"
"(EXP 1 4)"
"(SQR 1)"
"(DIV 34 77)"
"(MULT 12 5 3 7)"
"(Sub 1 2"
но я не совсем уверен, что вы хотите (если это не так, вам нужно уточнить для нас).
Аргумент split
- это регулярное выражение. Общепринято использовать его с чем-то вроде "/"
, который разбивает входную строку символами косой черты. Но выполнение этого не оставляет символов слэша в результате. Чтобы split
на строку, но оставить разделители в результатах, вам нужен lookahead. Регулярное выражение выше делает это. (?=<something>)
смотрит на какой-то шаблон, но не "потребляет" его; здесь шаблон имеет значение \\(
что означает одиночный (
символ, но ему предшествует обратная косая черта, потому что (
обычно имеет специальные значения в регулярном выражении).
Если вы хотите, чтобы все элементы в квадратных скобках были отдельно, вы можете использовать очень простое (и легко читаемое) регулярное выражение с помощью метода split
:
String[] array = s.split("[(*|)*|(*)*|)*(*]");
Это даст вам {ADD, EXP 1 4, SQR 1, DIV 34 77, MULT 12 5 3 7, Sub 1 2}
.
Если вы хотите сохранить вложенность, это сложнее, и я настоятельно рекомендую вам взглянуть на учебники регулярных выражений, например http://www.regular-expressions.info/tutorial.html.
q = q.replaceAll(")","");
String[] splittedString = q.split("(");
Теперь у вас есть массив строк с элементами, как показано ниже.
ДОБАВИТЬ
EXP 1 4
SQR 1
Надеюсь, это то, чего вы ожидали.
indexOf
возвращает целое число, поэтому код, который у вас есть, создает массив целых чисел.