2017-03-04 31 views
6

Mam ciąg java, który wygląda tak;Podział łańcucha Regex Java między separatorem i ogranicznikiem separacji

(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue) 

I chcę podzielić ten ciąg od ogranicznika (fname:jon)<here>(lname:doe).

próbowałem dzielenie przez regex \)\( ale to łamie mi kod

arr = s.split("\\)\\("); 
for (String a: arr) System.out.println(a); 

Wyjście

(fname:jon 
lname:doe 
guaranteer: Sam (W) Willis 
age:35 
addr:1 Turnpike Plaza 
favcolor:blue) 

ja również spojrzał na to pytanie: How to split a string, but also keep the delimiters?, ale to nie pomogło, bo w moim przypadku , Chcę zachować separator )( i równomiernie podzielić separator, tzn. Pierwszy nawias powinien przejść do pierwszego wyniku i drugiego do drugiego wyniku.

regex, że kiedyś był s.split("(?<=\\)\\()") i dała wynik:

(fname:jon)(
lname:doe)(
guaranteer: Sam (W) Willis)(
age:35)(
addr:1 Turnpike Plaza)(
favcolor:blue) 

To mój sygnał wyjściowy:

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue) 
+2

Spróbuj ')' –

+0

@Wiktor Stribiżew mam specjalnie podkreślić, że odpowiedź, dlaczego nie pomaga w moim przypadku. Czy możesz mi powiedzieć, dlaczego to duplikat? – Cupid

+0

Odpowiedzią, która generalizuje wszystkie te przypadki, jest http://stackoverflow.com/a/2848147/3832970. Trzeci od dołu to twój przypadek. –

Odpowiedz

7

można podzielić ciąg używając pozytywny uprzedzona i pozytywnego lookbehind tak:

RegEx (?<=\))(?=\()

DEMO

  1. (?<=\)) pozytywny lookbehind co wskazuje, że zamknięcie wspornik powinien poprzedzać pozycję podziału.
  2. (?=\() dodatnia z wyprzedzeniem, która wskazuje, że nawias otwierający powinien podążać za tą podzieloną pozycją.

Wyjście

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue) 

Kod

String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue)"; 
String arr[] = s.split("(?<=\\))(?=\\()"); 
for (String a: arr) System.out.println(a); 
+0

Usuń bezcelowe '. {0}' - nie ma żadnego efektu, a Ty jesteś niepoprawny: nie ma tu znaku "zerowego", a null char to "\ 0". Dopasowanie wynosi * pomiędzy * znakami opartymi na rozglądzie, co nie jest niczym specjalnym. – Bohemian

+0

@Bohemian I pierwotnie trzymałem '.{0} 'tylko po to, aby wskazać, że * to jest ogranicznik *. Przez zero miałem na myśli * pustą pozycję między dodatnim wyprzedzeniem a pozytywnym wyglądem *. Jednak dzięki za wskazanie, odpowiednio zaktualizowałem swoją odpowiedź. –

+0

Naprawdę nie zaktualizowałeś całego swojego postu, w szczególności pierwszego zdania – Bohemian

7

Można użyć pozytywny lookbehind i negatywny uprzedzona do osiągnięcia tego celu:

public static void main(String[] args) throws Exception { 
    String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)" 
      + "(addr:1 Turnpike Plaza)(favcolor:blue)"; 
    String[] arr = s.split("(?<=\\)(?!\\s))"); // positive lookbehind for ")" and negative lookahead for "space" 
    for (String str : arr) { 
     System.out.println(str); 
    } 

} 

O/P: (? <= \\) (= \\()

(fname:jon) 
(lname:doe) 
(guaranteer: Sam (W) Willis) 
(age:35) 
(addr:1 Turnpike Plaza) 
(favcolor:blue)