2016-08-09 46 views
0
String delimiterStr = "|", line="1231|08062016|4441|10|PayeeName1|REF1"; 
String ISSUE_UPLOAD_FILE_PATTERN = "(?<=(^|" + delimiterStr + "))(([^\"" + delimiterStr + "]*)|\"([^\"]*)\")(?=($|" + delimiterStr + "))"; 

List<String> splitString = new ArrayList<String>(); 
Matcher matcher = Pattern.compile(ISSUE_UPLOAD_FILE_PATTERN).matcher(line); 
while (matcher.find()) { 
    if (matcher.group(3) != null) {//NOPMD,old code 
    System.out.println(matcher.group(3)); 
    splitString.add(matcher.group(3)); 
    } 
} 
System.out.println(splitString.size()+"::--->"+splitString); 

OutPut :- 12::--->[1231, , 08062016, , 4441, , 10, , PayeeName1, , REF1, ] 

Oben Muster nimmt Platz nach jeder aufgeteilten Zeichenfolge, wie Sie in der Ausgabe sehen können. Ich möchte nach jeder Saite keinen Platz nehmen. Es muss Platz benötigen, wenn in der Eingabezeichenfolge Platz vorhanden ist, andernfalls sollte es keinen Platz einnehmen. Welche Änderungen müssen in meinem Muster vorgenommen werden?Platz nimmt nach jedem String

+0

Nein ist es nicht. Verwenden Sie eine for-each-Schleife, um Ihre Ausgabe zu drucken. Du wirst keine Leerzeichen sehen. – TheLostMind

Antwort

1

Es verhält sich wie erwartet. Wenn toString() auf einem ArrayList genannt wird, verwendet es AbstractCollection ‚s Implementierung, die wie geht:

public String toString() { 
    Iterator<E> it = iterator(); 
    if (! it.hasNext()) 
     return "[]"; 

    StringBuilder sb = new StringBuilder(); 
    sb.append('['); 
    for (;;) { 
     E e = it.next(); 
     sb.append(e == this ? "(this Collection)" : e); 
     if (! it.hasNext()) 
      return sb.append(']').toString(); 
     sb.append(',').append(' '); // adds space 
    } 
} 

Sie könnten eine einfache Schleife hinzufügen, um sicherzustellen, dass Räume für jedes Element nicht hinzugefügt werden:

 for (String s : splitString) { 
      System.out.println(s + "X"); 
     } 
+0

String ISSUE_UPLOAD_FILE_PATTERN = "([^ \" |] *) "; Kannst du erklären, welche Werte über dem Muster liegen? Nimmt es auch Leerzeichen? – RBP

+0

@RBP - Es entspricht allem außer Anführungszeichen und' | '. – TheLostMind

+0

(? <= (^ | "+ delimiterStr +")) ([^ \ "" + delimiterStr + "] [^" + delimiterStr + "]) | \" ([^ \ "]) \") (? = ($ | "+ delimiterStr +")). Wenn ich line = "1231 ||"; Es muss 3 Länge Liste mit 1231 Nummer und 2 Leerzeichen erzeugen. Derzeit erzeugt es eine Liste von 1 mit 1231 Nummer. Es ist keine Begrenzer danach nehmen, irgendeine Idee, welche Änderungen benötigt werden, um es als leer zu nehmen – RBP

0

ISSUE_UPLOAD_FILE_PATTERN = "(? < = (^ |" + TrennzeichenStr + ")) (([^ \" "+ TrennzeichenStr +"] [^ "+ TrennzeichenStr +"]) | \ "([^ \"]) \ ") (? = ($ |" + delimiterStr + "))";

Oberes Muster löste mein Problem.