2013-10-16 23 views
0

我想將一個字符串分解成一個由文本行組成的數組列表。每90個字符創建一行,或者遇到換行符(\ r)。每次遇到一個字符時在數組列表中分割一個字符串

我用這打破了字符串到一個數組,每90個字符(partionSize代碼):

private static List<String> getParts(String string, int partitionSize) { 
    List<String> parts = new ArrayList<String>(); 
    int len = string.length(); 
    for (int i=0; i<len; i+=partitionSize) 
    { 
     parts.add(string.substring(i, Math.min(len, i + partitionSize))); 
    } 
    return parts; 
    } 

如何修改這個,以便它檢查換行符(「\ r」)並在每次檢測到時分裂,每90個字符分裂一次?

__

UPDATE:

使用正則表達式溶液下方設置,像這樣:

String[] parts = string.split("(?<=\\G.{" + partitionSize + "})|\r|\n"); 

I輸入的字符串斷多行,例如:

1. 
2. 
3. 
4. 
5. 

當我使用下面的正則表達式將它分成數組[]部分時,parts.length是8,然後打印在部件的每個項目返回此:

line 0 is 1. 
line 1 is 
line 2 is 2. 
line 3 is 
line 4 is 3. 
line 5 is 
line 6 is 4. 
line 7 is 
line 8 is 5. 

對於這種情況,parts.length應5.

+1

我不認爲你會得到該輸出爲您的字符串。請再檢查一次。它給了我需要的那個字符串的輸出。 –

+0

如果我這樣做,那麼它的工作原理如下:String [] parts = string.split(「(?<= \\ G. {」+ partitionSize +「})| \ r \ n」);我是否從你的回答中刪除了這一點而錯過了某些東西| [\ r \ n] | ? – Ila

+0

行分隔符根據操作系統而不同。在Unix上它是'\ n',在Windows上它是'\ r \ n',在MAC上它是'\ r'。 –

回答

3

您可以分割使用以下正則表達式:

String[] arr = str.split("(?<=\\G.{90})|[\r\n]|\r\n"); 
  • (?<=\\G.{90})對空字符串分割之前由90個字符,從以前的比賽開始。 \\G錨點導致正則表達式從前一場比賽結束的位置開始匹配。因此,首先匹配90個字符,然後匹配下一個90個字符,依此類推。
  • [\r\n]拆分\r\n
  • \r\n拆分\r\n,這是窗口上的行分隔符。

演示代碼:

String str = "abcdefghi\njkl\rmnopasdf";    
int maxCharacters = 5; 

String[] arr = str.split("(?<=\\G.{" + maxCharacters + "})|[\r\n]|\r\n");  
System.out.println(Arrays.toString(arr)); 

輸出:

[abcde, fghi, jkl, mnopa, sdf] 

參考文獻:

+0

我可以在那個正則表達式中使用一個變量,而不是{90},{MAX_NUMBER_OF_LINES}左右嗎? – Ila

+1

@Ali是的,你可以。只需使用字符串連接來構建正則表達式。 –

+0

我從這個正則表達式得到一個奇怪的結果。如果我循環並打印出每個項目的部分,我會爲每個換行獲得一個額外的分割。例如,如果我在一行中輸入一個字符串「1. 2. 3. 4.」,輸出顯示項目1 =「1」。項目2 =「」項目3 =「2.」項目4 = 「「 等等。你認爲這與我的字符串進入的格式有關嗎? – Ila

0

我稱之爲string.split("\r")到上的線斷創建字符串分割的陣列。然後遍歷每一個,如果它的長度超過90個字符,則在該點分割它。

+1

您必須在90個字符的每個分割處動態地增大陣列數量 – Cruncher

+0

非常正確。上面涉及正則表達式的答案是一個更好的解決方案。 –

相關問題