2012-03-17 9 views
5

Chcę podzielić ciągi w postaci EADGBE lub DADF # AD na oddzielne ciągi, z których każdy zawiera jedną literę lub jedną literę plus znak #. Czy istnieje jakiś bardziej elegancki sposób niż iterowanie przez sznur z podejrzanym podejściem?Jaki jest dobry sposób na rozdzielenie łańcucha bez separatora w Javie?

String.split w oczywisty sposób opiera się na ogranicznikach, które są następnie odrzucane, co w ogóle mi nie służy - przez kilka minut myślałem, że split("[a-gA-G]#?"); będzie działać, ale nie, to nie pomaga w wszystko - prawie chcę czegoś przeciwnego ...

+0

Czy możesz podać przykład łańcucha, który chcesz podzielić? – chandsie

+0

Obawiam się, że będziesz musiał użyć metody brutalnej siły. – mac

+0

To jest trywialne. Idź po brutalną siłę. Nie dodawaj złożoności i przeglądów wyrażenia regularnego. –

Odpowiedz

3

Brutalna siła może być najlepszą opcją, zarówno pod względem kodu, jak i wydajności.

Alternatywnie, można użyć Matcher

Pattern p = Pattern.compile("[a-gA-G]#?"); 
Matcher m = p.march(inputString); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) 
    matches.add(m.group()); 
+0

Ach, bardzo miło - żadne z moich badań nie znalazło nic o Matcherach! Dziękuję za to. :) – Oolong

1

Jeśli forsee zmiany w strukturze można użyć:

String s = "DADF#AD"; 
    Pattern p = Pattern.compile("([a-gA-G]#?)"); 
    Matcher matcher = p.matcher(s); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
1

Korzystanie uprzedzona i lookbehind działa: String regex = "(?<=.)(?=\\w#?)";

np

import java.util.Arrays; 

public class Foo { 
    public static void main(String[] args) { 
     String[] tests = {"EADGBE", "DADF#AD"}; 
     String regex = "(?<=.)(?=\\w#?)"; 
     for (String test : tests) { 
     System.out.println(Arrays.toString(test.split(regex))); 
     } 
    } 
} 

zwrócone:

[E, A, D, G, B, E]
[D, A, D, F #, a, d]

+0

'String regex =" (? = (?! ^) \\ w #?) ";", Proszę bardzo. –

+0

@refp: to również działa - zapobiegając przechwyceniu początku linii. Zręczny i dzięki! –

+0

Ah ... Nie wiedziałem, że to była opcja! Być może nie są to najbardziej przyjazne człowiekowi techniki - a może naprawdę mam na myśli nowicjusza - ale na pewno dobrze jest mieć świadomość, że jest to coś, co można zrobić za pomocą wyrażeń regularnych w Javie. Dziękuję Ci! – Oolong

0

Jak o tym: dodawanie ograniczników następnie dzielone:

Metoda ta dodaje ograniczniki

private static String delimit(String in) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < in.length()-1; i++) { 
    sb.append(in.charAt(i)); 
    if (in.charAt(i+1) != '#') 
     sb.append(';'); 
    } 
    return sb.toString(); 
} 

Aby go użyć:

String[] notes = delimit("DADF#AD").split(";"); 
+0

Dlaczego nie używać pętli for, aby wygenerować listę tokenów zamiast budować niepotrzebny łańcuch pośredni? – Dunes

+0

@Dunes Mam już opublikowany dziesiątki tych standardowych rozwiązań na SO - po prostu chciał zrobić coś innego;) –

+0

heh! Myślę, że to zadziała, tak. Zastanawiam się nad wstawianiem ograniczników, ale pomyślałem, że musi być prostszy sposób ... który, jak wskazali inni użytkownicy, jest! Ale dzięki w każdym razie, dobrze jest być świadomym alternatyw ... – Oolong

Powiązane problemy