2016-04-07 14 views
7

Próbuję zastąpić wszystkie powtarzające się znaki z ciągu w języku Java i pozwolić tylko jeden.Rekursywna replaceAll java

Na przykład:

aaaaa --->a

Do tego, starałem się metodą replaceAll:

"aaaaa".replaceAll("a*","a") //returns "aa" 

I opracowali metodę rekurencyjną, która prawdopodobnie nie jest bardzo wydajny:

public String recursiveReplaceAll(String original,String regex, String replacement) { 
    if (original.equals(original.replaceAll(regex, replacement))) return original; 
    return recursiveReplaceAll(original.replaceAll(regex, replacement),regex,replacement); 
} 

Ta metoda działa, właśnie zastanawiałem się, czy było coś przy użyciu RegEx na przykład, który wykonuje pracę z lepszą wydajnością.

+2

'replaceAll (" a + "," a ")' – rock321987

Odpowiedz

12

Twoje podejście replaceAll było prawie poprawne - po prostu * dopasowuje 0 wystąpień. Chcesz + oznaczać "jeden lub więcej".

"aaaaa".replaceAll("a+","a") // Returns "a" 
7

Możesz to zrobić bez rekursji. Wyrażenie regularne: "(.)\\1+" będzie capture każdy znak, po którym następuje sama at least once, i zastępuje je przechwycony znak. W ten sposób usuwa wszelkie powtarzające się znaki.

public static void main(String[] args) { 
    String str = "aaaabbbaaa"; 
    String result = str.replaceAll("(.)\\1+", "$1"); 
    System.out.println(result); // prints "aba". 
} 

Dzięki temu działa dla wszystkich znaków.

Powiązane problemy