2017-01-03 1 views
1

Я просмотрел большинство вопросов, связанных с регулярным выражением, и ни один из них не соответствует моему конкретному случаю.Разбиение строки по круглым скобкам, группировка с круглыми скобками, java

Скажем, у меня есть строка: "ABe(CD)(EF)GHi"

Я хочу: "A", "Be", "(CD)", "(EF)", "G", "Hi"

Я пробовал:

.split("(?=[A-Z\\(\\)])"), which gives me: "A", "Be", "(", "C", "D", ")", "(", "E", "F", ")", "G", "Hi". 

Есть идеи?

ответ

5

Попробуйте это:

String input = "ABe(CD)(EF)GHi"; 

String[] split = input.split("(?=[A-Z](?![^(]*\\)))|(?=\\()|(?<=\\))"); 
System.out.println(Arrays.toString(split)); 

Выход

[A, Be, (CD), (EF), G, Hi] 

Разъяснения

(?=    Before: 
    [A-Z]   Uppercase letter 
    (?![^(]*\))  not followed by ')' without first seeing a '(' 
         i.e. not between '(' and ')' 
) 
|(?=    or before: 
    \(    '(' 
) 
|(?<=    or after: 
    \)    ')' 
) 
+0

Это работало. Спасибо :) – w1drose

0

Попробуйте это ..

String array = "ABe(CD)(EF)GHi"; 
int i = 0; 

for(int j=0; j<array.length();) 
{ 
    if(Character.isUpperCase(array.charAt(i))) 
    { 
     j++; 
     System.out.println(array.substring(i, i+1)); 
     if(Character.isUpperCase(array.charAt(i+1))) 
     { System.out.println(array.substring(i+1, i+3)); 
      i = i+3; 
      j = j + 3; 
     } 
    } 
    else 
    { 
     System.out.println(array.substring(i+1, i+3)); 
     i = i+4; 
     j = j + 3; 
    } 
} 
+0

Пожалуйста, объясните свой код – Saveen

0

Выполнение сопоставления вместо разделения.

String s = "ABe(CD)(EF)GHi"; 
Pattern regex = Pattern.compile("\([^()]*\)|[A-Z][a-z]+|[A-Z]"); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(0)); 
} 

DEMO

+0

@ WiktorStribiżew кто-то закрыл тот же вопрос, что и обман :-) –

+0

, так что вы не можете его перепечатать, правда? дай мне проверить.. –

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