2016-06-23 6 views
0

Ich möchte nach ca. 200 Zeichen oder das nächste Sonderzeichen:Split String nach ca. 100 Zeichen und nächstes Zeichen (Java)

Die Zeichenfolge ist wie <data>|...|<data>| formatiert, wobei ein <data> Block zwischen 30 und 70 Zeichen ist.

My gewünschtes Ergebnis wäre ein String-Array sein, wie

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

wo jede Zeile ca. 200 Zeichen lang ist.

Mein Code sieht aus wie

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

Das Ergebnis, eine korrekte Menge an Ersatz erzeugt (3), aber das Gesamtergebnis sollte ein String-Array sein.

Gibt es eine Regexp (ähnlich SO Q&A), die dieses Problem behandeln könnte? Eine Lösung mit for-Schleifen ist ebenfalls akzeptabel.

Scratch Pad:

Fühlen Sie sich frei auf regex101.com zu testen (mit meinem Versuch, und die Testdaten)

+0

ich einen Fehler mit dem Code in der ersten println erhalten: 'str' ist nicht definiert. – sotix

+1

Warum teilst du es nicht auf jeden speziellen Charakter und rekonstruierst es dann? Langsamer, aber einfacher zu machen. – user3719857

+0

@Sotix: 'str' ist fest – Markus

Antwort

2

Ohne regex. Teilen Sie die Daten einfach unter "|". Überprüfen Sie dann, ob das Hinzufügen eines Teils zur vorhandenen Zeile die 200 Zeichen überschreitet. Wenn dies der Fall ist, dann starte eine neue Zeile. Quick and dirty:

bearbeiten: hinzugefügt Kommentare und Formatierung

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

Sie haben Recht, Dinge zu quantifizieren: Um die Fehler zu minimieren und Grenzfälle wie 200 Zeichen von Daten abzudecken, wird ein Regex-Split nicht tun, muss man mehr oder weniger folgen. –

Verwandte Themen