2010-11-08 157 views
2

我想了解如何基於算術運算將字符串拆分爲N個單獨的字符串的一些指導;例如string.length()/ 300。將字符串N拆分爲N/X個字符串

我所知道的方式帶分隔符如

testString.split(","); 

,但這樣做如何做一個使用貪婪/勉強/佔有慾量詞與split方法?


更新:根據要求什麼我希望獲得一個類似的例子;

String X = "32028783836295C75546F7272656E745C756E742E657865000032002E002E005C0" 

在X生成的/ 3 (或多或少...由手工完成)

X[0] = 32028783836295C75546F 

X[1] = 6E745C756E742E6578650 

x[2] = 65000032002E002E005C0 

不要擔心,解釋如何把它放入數組,我有沒有問題,只對如何如果有,你希望每個String是一個固定長度的分割不使用分隔符,但運算

+0

你能更具體?如果你舉一個你想要的例子,這將有所幫助。 – Hal 2010-11-08 22:12:06

+0

@hal:完成更新,感謝您的關注! – Carlos 2010-11-08 22:18:58

回答

10

你可以做到這一點通過(?<=\G.{5})分裂,從而字符串aaaaabbbbbccccceeeeefff將分成以下幾部分:

aaaaa 
bbbbb 
ccccc 
eeeee 
fff 

\G以前匹配發生的位置(零寬度)的位置相匹配。最初,\G從字符串的開始處開始。請注意,默認情況下,.元字符不匹配換行符,因此如果您希望它匹配每個字符,請啓用DOT-ALL:(?s)(?<=\G.{5})

一個演示:

class Main { 
    public static void main(String[] args) { 
    int N = 5; 
    String text = "aaaaabbbbbccccceeeeefff"; 
    String[] tokens = text.split("(?<=\\G.{" + N + "})"); 
    for(String t : tokens) { 
     System.out.println(t); 
    } 
    } 
} 

可以在這裏在線測試:http://ideone.com/q6dVB

編輯

既然你問對正則表達式的文檔,這裏有主題的具體教程建議正則表達式包含:

+0

優秀的答案,正是我所尋找的,歡呼! – Carlos 2010-11-08 22:21:15

+0

再次感謝,嘿!很棒的網站,以舉例的方式。放輕鬆吧 – Carlos 2010-11-08 22:27:35

+0

@Carlucho,不客氣! – 2010-11-08 22:27:38

4

,您可以使用GuavaSplitter

int length = string.length()/300; 
Iterable<String> splitStrings = Splitter.fixedLength(length).split(string); 

splitStrings與最後的可能是個例外。每個String將有length的長度。最後的長度可能在1到length之間。

注意,不像String.split,它首先建立一個ArrayList<String>,然後使用toArray()產生最終結果String[],番石榴的Splitter是懶惰,當split被稱爲不與輸入字符串做任何事情。當你遍歷結果Iterable時,字符串的實際分割和返回就完成了。這使您可以迭代結果,而無需分配數據結構並將其全部存儲,或者將它們複製到任何類型的Collection中,而無需通過中間的ArrayListString[]。根據你想要對結果做什麼,這可以更有效。這也是更清楚你在做什麼比正則表達式。

1

不知道,你可能需要一個接受字符串和整數次的方法並返回一個字符串列表。僞代碼(沒有檢查它的工作與否):

public String[] splintInto(String splitString, int parts) 
{ 
    int dlength = splitString.length/parts 
    ArrayList<String> retVal = new ArrayList<String>() 
    for(i=0; i<splitString.length;i+=dlength) 
    { 
     retVal.add(splitString.substring(i,i+dlength) 

    } 
    return retVal.toArray() 
} 
+0

嗯不知道這個'add'業務 – 2010-11-08 22:24:25

+0

不,數組在Java中沒有方法。 – 2010-11-08 22:29:04

+0

我說過,僞代碼。而這主要是Fantom中數組添加的剩餘部分。 – 2010-11-08 22:41:20

2

如何處理純舊的String.substring?這是內存友好(因爲它重新使用原始字符數組)。

1

嗯,我認爲這可能是一種有效的方法來做到這一點。

int N=300; 
int sublen = testString.length()/N; 
String[] subs = new String[N]; 
for(int i=0; i<testString.length(); i+=sublen){ 
    subs[i] = testString.substring(i,i+sublen); 
} 

,如果你需要的物品作爲char[]數組,而你可以做得更快個人Strings - 這取決於你需要如何使用結果 - 例如使用testString.toCharArray()