2016-06-23 6 views
0

約文字列を分割したいと思います。 200文字または次の特殊記号:約100文字後の文字列を分割して次の記号(Java)

文字列は<data>|...|<data>|のようにフォーマットされ、1つの<data>ブロックは30〜70文字の形式です。

私の望ましい結果は、すべての行が約200文字の長さである

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

のような文字列配列になります。

私のコードは、結果は、代替の正しい量(3)を生成するが、全体的な結果は、文字列配列であるべきである

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

ように見えます。

この問題を処理できる正規表現(SO Q&Aに似ています)がありますか? forループを使用したソリューションも使用できます。

スクラッチパッド

regex101.comでテスト気軽に(私の試みとテストデータが含まれます)

+0

書式設定: 'str'が定義されていません。 – sotix

+1

特別な文字を1文字ずつ分割して再構成してみませんか?ゆっくりしますが、やりやすくなります。 – user3719857

+0

@Sotix: 'str'は固定されています – Markus

答えて

2

正規表現なし。データを "|"で分割するだけです。次に、既存の行に部品を追加するのが200文字を超えるかどうかを確認します。そうであれば、新しい行を開始します。クイックや汚れ:

編集:追加されたコメントと私は最初のprintlnであなたのコードでエラーが発生します

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文字のデータのような境界のケースをカバーするために、正規表現の分割は行いません。 –