2015-09-11 35 views
-1

這裏是我的字符串....
〜ABC ~~高清~~~ b ~~~分割控制如何打破了 「空」 的部分

我想(〜)拆分此字符串。使用簡單的簡單我不能夠得到最後一部分爲空/空。

輸出我想找..

null 
abc 
null 
null 
def 
null 
null 
null 
b 
null 
null 
null 
+0

你想要做什麼是不所謂的字符串拆分。你想要一個函數,每次發現它時都會輸出null〜? –

+0

「使用簡單的簡單」你的意思是「使用簡單的分裂」? – yshavit

+0

確實可能是java中的一個bug。 輸出爲: '', 'ABC', '', '高清', '', '', 'B' 代碼: 字符串S =「〜ABC DEF ~~ ~~~ b〜 ~~「; String s [] = S.split(「[〜]」); (String ss:s) System.out.println(「'」+ ss +「',」); –

回答

2

split沒有返回null,但""空字符串。同樣默認情況下,它會從結果數組中刪除空的尾部字符串。如果你想關閉這個優化使用split(regex,limit)limit

text.split("~", -1) 

但是請注意,分裂產生的空元素只有分隔符之間。因此,如果部分文字如~~~和分隔符~只會產生兩個空白字符串。如果你真的要產生三個空格,你可以使用類似

text.split("~|(?<=~)(?<!^~|~$)", -1) 

知道這個正則表達式的就是分裂不僅~而且在地方是正確的最後~後一組的分隔符像~~在添加空白字符串。這種方法的問題是,當我們在放置在字符串的開始或結尾處的~上分割時,這樣的空白字符串是不必要的,所以我們需要避免這種歪斜。

爲了使所有可能我使用look-around mechanism,或更確切地說,後視(?<=...)和負面後視(?<!...)。這些機制將檢查在當前位置存在之前是否存在/不存在匹配...部分中指定的正則表達式。

所以~|(?<=~)(?<!^~|~$)將在

  • ~分裂每個波形符具有~之前

  • | OR

  • (?<=~)地方,

    • (?<!^~|~$),但並不後:

      • ^~波浪線是在我們的字符串(由^錨表示)開始,
      • ~$放置在我們的字符串的末尾(由$錨表示)。

DEMO:

String text = "~abc~~def~~~b~c~~~"; 
for (String s : text.split("~|(?<=~)(?<!^~|~$)", -1)) { 
    System.out.println("'" + s + "'"); 
} 

輸出:

'' 
'abc' 
'' 
'' 
'def' 
'' 
'' 
'' 
'b' 
'' 
'c' 
'' 
'' 
'' 
+0

這不完全產生OP想要的輸出。特別是,序列「abc ~~ def」只會在中間產生一個空字符串,而不是兩個,而「def ~~~ b」只會產生兩個空字符串,而不是三個。 – yshavit

+0

@yshavit是的,但我認爲這是預期的行爲,因爲OP提到只有缺乏拖尾元素的問題。無論如何將嘗試更新與更好的解決方案。 – Pshemo

+0

Bravo!這是一些很好的正則表達式,在那裏。感謝@提醒提醒我看看。 :) OP,我的一個額外的建議是添加評論,如果你使用這個,解釋正則表達式或至少鏈接回到這裏。否則,如果您稍後必須重新訪問,可能很難理解正則表達式的作用。 – yshavit

0

要省略空/空,你可以使用Guava

Iterable<String> strs = Splitter.on('~').omitEmptyStrings().split(toSplit); 
+0

「*我無法將最後一部分作爲空白/空白*」,所以它看起來像OP不想省略空字符串。 – Pshemo

1

你不能返回null,但也許這可以幫助你。

String str = "~abc~~def~~~b~~~"; 
str = str.replaceAll("~", "-"); 

char[] chars = str.toCharArray(); 
for (int i =0; i < chars.length; i++) 
{ 
    String check = Character.toString(chars[i]); 
    if(check.contentEquals("-")) 
    { 
     System.out.println(); 
     System.out.println(check); 
    } 
    else 
    { 
     System.out.print(check); 
    } 

} 
1

怎麼樣:

使用字符串標記分裂Java中的字符串沒有分裂:

import java.util.StringTokenizer; 

public class tt { 
    public static void main(String a[]){ 
     String s = "012ab567ab0123ab"; 
     String delims = "ab "; 
     StringTokenizer st = new StringTokenizer(s, delims); 
     System.out.println("No of Token = " + st.countTokens()); 
     while (st.hasMoreTokens()) { 
      System.out.println(st.nextToken()); 
     } 
    } 
} 

或使用您的分裂功能

public class MySplit { 

public static String[] mySplit(String text,String delemeter){ 
    java.util.List<String> parts = new java.util.ArrayList<String>(); 
    text+=delemeter;   

    for (int i = text.indexOf(delemeter), j=0; i != -1;) { 
     parts.add(text.substring(j,i)); 
     j=i+delemeter.length(); 
     i = text.indexOf(delemeter,j); 
    } 


    return parts.toArray(new String[0]); 
} 

public static void main(String[] args) { 
    String str="012ab567ab0123ab"; 
    String delemeter="ab"; 
    String result[]=mySplit(str,delemeter); 
    for(String s:result) 
     System.out.println(s); 
} 

}