2016-06-23 31 views
0

我想在大約後分割一個字符串。 200個字符或下一個特殊符號:大約100個字符和下一個符號後分割字符串(Java)

字符串格式化爲<data>|...|<data>|,其中一個<data>塊的字符數介於30到70個字符之間。

我期望的結果將是一個字符串數組像

<data>|<data>| 
<data>| 
<data>|<data>|<data>| 

其中每行大約是200個字符長。

我的代碼看起來像

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import org.junit.Test; 

public class RegexpTest { 

@Test 
public void testRegexp() throws Exception { 
    String data = "Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|"; 
    String pat = ".{1,200}(\\d|\\s|\\w|\\.|\\:{1,70})\\|"; 
    String ans = data.replaceAll(pat, "X"); 
    //Pattern regex = Pattern.compile(pat); 
    //Matcher regexMatcher = regex.matcher(str); 

    System.out.println(data.length()); //prints 528 
    System.out.println(ans.length()); //prints 3 
} 
} 

結果產生替代(3)的正確量,但總的結果應該是一個字符串數組。

是否有正則表達式(類似於SO Q&A)可以解決這個問題?使用for循環的解決方案也是可以接受的。

便籤

隨意測試的regex101.com(包括我的嘗試和測試數據)

+0

我得到一個錯誤在第一的println代碼:'str'沒有定義。 – sotix

+1

爲什麼你不把它分成一個特殊的字符,然後重建它。更慢,但更容易做到。 – user3719857

+0

@Sotix:'str'是固定的 – Markus

回答

2

沒有正則表達式。只需在「|」處分割數據即可。然後檢查在現有行中添加零件是否會超過200個字符。如果確實如此,那麼開始新的一行。快速和骯髒的:

編輯:添加註釋和格式化

public static void main(String[] args) { 
    // your data 
    String data = "Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|"; 
    // do the split 
    List<String> out = new Test().splitToApproxAt(data, 200); 
    // print the splitted lines 
    for(String o : out){ 
     System.out.println(o); 
    } 
} 

public List<String> splitToApproxAt(String data, int len){ 
    // split at the pipe symbol "|" 
    String[] parts = data.split("\\|"); 

    // this will be our current line in progress 
    String line = ""; 

    // this will store the lines up to 200 chars 
    List<String> out = new ArrayList<String>(); 

    // for every data-part 
    for(String part : parts){ 
     if(part.length() > len){ 
      System.out.println("oh shit, what do?"); 
      continue; 
     } 
     // would this exceed the 200 chars? 
     if(line.length() + part.length() > len){ 
      // yes! add previous line to output 
      // and start a new one. 
      out.add(line); 
      line = part; 
     }else{ 
      // no we can attach that to the 
      // current line 
      if(line.length()>0){ 
       // delimit with pipe 
       line += "|" +part; 
      }else{ 
       // line was empty, no pipe 
       line = part; 
      } 
     } 
    } 
    // add the last line to the output 
    out.add(line); 
    return out; 
} 
+0

你是對的,要量化的東西:爲了儘量減少錯誤和覆蓋200個字符的數據邊界情況,正則表達式分割不會做,必須或多或少地遵循你的方法。 –