2012-03-26 3 views

ответ

48

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

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

Как the documentation for String.split(String,int) объясняет:

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

+0

ruakh Я попробовал ваш ответ, когда мой Reges является " \\ (", он отлично работает, но когда мое регулярное выражение есть" (", он выбрасывает исключение, вы можете сказать почему? –

+3

@ChandraSekhar: Это потому, что' ('имеет особое значение в регулярных выражениях Java (например,' (34) + 'означает одно или несколько вхождений' 34', в отличие от '34 +', что означает «a' 3», за которым следует один или несколько вхождения '4'.) Таким образом, обратная косая черта используется для« цитирования »или« выхода »из нее и указывает« фактический »(« символ », а не использование' ('для его особого значения. – ruakh

+0

@ruakh спасибо за ваш ответ. –

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

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

EDIT: Сбежал кронштейн, согласно @ ниже Педро комментарий.

+0

Вызывает исключение. java.util.regex.PatternSyntaxException: Unclosed group near index 1 –

2

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

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, ')'))); 
+2

"Simpler"? Кажется, каждому свое. Я считаю, что регулярное выражение является самым простым и быстрым. Кроме того, он поддерживает строки, и он не взорвется, если 'str.indexOf (c) == -1'. – ruakh

+1

Это проще, потому что вам не нужно знать о регулярных выражениях, чтобы использовать его. Конечно, это требует некоторой проверки ошибок, но это не подлежит сомнению. И если нужны строки, просто изменить параметр 'char c' на' String c' будет делать трюк. И да, это быстрее, ваше решение должно собирать и сопоставлять регулярное выражение каждый раз, когда оно вызывается, и OP нужно будет избегать специальных символов, о которых он не знает. –

+0

Re: «И да, это быстрее»: Ну, очевидно. Я не говорил, что регулярное выражение выполняется быстрее, только это довольно быстро и намного проще. Re: «просто изменение параметра' char c' на 'String c' будет делать трюк»: вам также нужно было бы изменить '1' на' c.length() '. – ruakh

Смежные вопросы