2017-05-18 50 views
2

我正在使用guava 21.0並試圖通過提供一個正則表達式(\\d)拆分String。 但是,我不知道爲什麼不工作。正則表達式不工作在番石榴

如果我將正則表達式更改爲任何非正則表達式(例如「a」),那麼它工作正常。

下面是代碼:當正則表達式應用於

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); 
     } 
    } 
} 

結果:

abc243gca87asas ** 78sassnb32snb1ss22220220

任何幫助,將不勝感激。

+0

什麼是預期的結果? –

+0

@SergeyProkofiev它應該拆分字符串,如果它發現任何數字,如代碼所示。 –

+0

@SergeyProkofiev這不會解決問題,我以後決定更改正則表達式?我不得不修改我認爲不是好主意的代碼。 –

回答

5

您必須使用Splitter.onPattern("\\d+")而不是Splitter.on("\\d+")

Here's的Javadoc分配器的on方法,這就是它說:

返回使用給定的固定字符串作爲分隔符分離器。例如,Splitter.on(「,」).split(「foo,bar,baz」)返回一個包含[「foo」,「bar,baz」]的可迭代的 。

所以,分離器是視爲String字面和不regex,因此,如所預期它不分裂String。如果你想基於正則表達式拆分,那麼你可以使用字符串的split方法或分配器的onPattern方法,例如:

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

或Splitters onPattern(String separatorPattern)方法。 – James

+0

我想'String.split'的答案你需要使用\\ d +來避免空的標記字符串。 –

+0

從本書**谷歌番石榴入門**第15頁開始,它說:「Splitter類執行Joiner類功能的反向操作。Splitter類可以分割爲單個的 字符,一個固定的字符串,一個java.util.regex.Pattern包,一個表示 正則表達式的字符串,或者一個CharMatcher類(另一個Guava類,本章也會涉及 )。「現在我真的很困惑,書上說正則表達式可以應用,文檔說正則表達式不能應用。 –