Разделить по первой найденной строке в Java - PullRequest
26 голосов
/ 26 марта 2012

Нельзя сказать функции String.split ("("), что она должна разбиваться только на первую найденную строку "("?

Пример:

String test = "A*B(A+B)+A*(A+B)";
test.split("(") should result to ["A*B" ,"A+B)+A*(A+B)"]
test.split(")") should result to ["A*B(A+B" ,"+A*(A+B)"]

Ответы [ 3 ]

47 голосов
/ 26 марта 2012

Да, абсолютно:

test.split("\\(", 2);

Как документация для String.split(String,int) объясняет:

Параметр limit контролирует количество разшаблон применяется и поэтому влияет на длину результирующего массива.Если предел n больше нуля, шаблон будет применен не более n - 1 раз, длина массива будет не более n , иПоследняя запись массива будет содержать все входные данные, кроме последнего соответствующего разделителя.

4 голосов
/ 26 марта 2012
test.split("\\(",2);

См. Javadoc для получения дополнительной информации

РЕДАКТИРОВАТЬ : Экранирующая скобка, согласно комментарию @ Педро ниже.

2 голосов
/ 26 марта 2012

Попробуйте с этим решением, оно универсально, быстрее и проще, чем с помощью регулярного выражения:

public static String[] splitOnFirst(String str, char c) {
    int idx = str.indexOf(c);
    String head = str.substring(0, idx);
    String tail = str.substring(idx + 1);
    return new String[] { head, tail} ;
}

Проверьте это так:

String test = "A*B(A+B)+A*(A+B)";
System.out.println(Arrays.toString(splitOnFirst(test, '(')));
System.out.println(Arrays.toString(splitOnFirst(test, ')')));
...