2017-05-18 2 views
2

Ich verwende guava 21.0 und versuche, eine String durch Bereitstellung einer Regex (\\d) zu teilen. Allerdings bin ich mir nicht sicher, warum nicht funktioniert.Regex funktioniert nicht in Guava

Wenn ich Regex zu etwas ändern, das nicht Regex ist (zB "a"), dann funktioniert es gut. Hier

ist der Code:

public class SplitWithRegex { 
    public static Iterable<String> splitByRegex(String string, String regex){ 
     return Splitter.on(regex).trimResults().omitEmptyStrings().split(string); 
    } 
    public static void main(String[] args) { 
     Iterable<String> itr = splitByRegex("abc243gca87asas**78sassnb32snb1ss22220220", "\\d"); 
     for(String s : itr){ 
      System.out.println(s); 
     } 
    } 
} 

Ergebnis, wenn Regex angewendet wird:

abc243gca87asas ** 78sassnb32snb1ss22220220

Jede Hilfe würde geschätzt.

+0

Was Ergebnis erwartet? –

+0

@SergeyProkofiev sollte es die Zeichenfolge teilen, wenn es eine Ziffer findet, wie der Code sagt. –

+0

@SergeyProkofiev dies würde das Problem nicht lösen, was entscheide ich mich, die Regex später zu ändern? Ich muss so viel Code ändern, dass ich keine gute Idee finde. –

Antwort

5

Sie müssen Splitter.onPattern("\\d+") und nicht Splitter.on("\\d+") verwenden.

Here's die javadoc für on Methode der Splitter, das ist, was es sagt:

Gibt einen Splitter, der den gegebenen festen Zeichenkette als Trennzeichen verwendet. Zum Beispiel gibt Splitter.on (",") .split ("foo, bar, baz") eine iterable zurück, die ["foo", "bar, baz"] enthält.

So Separator ist ein so behandelt, als String wörtlichen und nicht regex und daher ist es nicht spalten nicht die String wie erwartet. Wenn Sie Regex basierend Splitting wollen, dann können Sie String die Verwendung split Methode oder onPattern der Splitter Verfahren, z.B .:

String[] tokens = "abc243gca87asas**78sassnb32snb1ss22220220".split("\\d+"); 
for(String token : tokens){ 
    System.out.println(token); 
} 

public static Iterable<String> splitByRegex(String string, String regex){ 
    return Splitter.onPattern(regex).trimResults().omitEmptyStrings().split(string); 
} 
+2

oder Splitter onPattern (String separatorPattern) -Methode. – James

+0

Ich nehme an, für die Antwort mit 'String.split' müssen Sie \\ d + verwenden, um leere Token-Strings zu vermeiden. –

+0

Aus dem Buch ** Erste Schritte mit Google Guava ** Pg Nr. 15, es sagt "Die Splitter-Klasse führt die inverse der Funktionen der Joiner-Klasse. Eine Splitter-Klasse kann auf eine einzige Zeichen, eine feste Zeichenfolge, teilen ein java.util.regex.Pattern-Paket, eine Zeichenfolge, die einen regulären Ausdruck darstellt, oder eine CharMatcher-Klasse (eine weitere Guava-Klasse, die in diesem Kapitel ebenfalls behandelt wird). " Jetzt bin ich wirklich verwirrt, Buch sagt, Regex kann angewendet werden und Docs sagen Regex kann nicht angewendet werden. –