ich zerlege eine File mit nem RegEx Pattern.
Die File ist zB so aufgebaut:
one##
two##
one##two##three##
...
Java:
Pattern pat =Pattern.compile("[^##]+");Matcher mat = pat.matcher(strLine);
Allerdings wird dadurch kein leeres Element erkannt:
one####three##
Dort würde mir das zweite Element fehlen, und statt dessen das dritten Element an die zweite Stelle rücken.
Wie kann ich das detektieren?
Die Anzahl der ## SOLL aber eine Rolle spielen. Also es müssen genau 2 sein, und wenn danach noch 2 weitere kommen muss ein leerer String erzeugt werden.
int i =0;String[] newString =newString[10];String strLine ="one##two####three##";Matcher mat =Pattern.compile("(.*?)##").matcher(strLine);while(mat.find()){
newString[i]= mat.group(1);System.out.println(newString[i++]);}
Jetzt müsste ich nur noch Steuerzeichen mit erkennen können. Aus der Dokumentation lese ich heraus, dass das mit "\s" geht.
Aber wie bastel ich das denn jetzt da rein? Ich hab schon alles durchprobiert und krieg es einfach nicht hin :noe:
(Ein String zwischen zwei ## kommt zB aus einem Textfeld, in dem auch Zeilenumbrüche vorkommen. Ich lese eine komplette Zeile dann mit readLine() ein, aber dort wie eben der Zeilenumbruch steht wirds chaotisch. Er wird bisher ja nicht erkannt.
"((.|\\s)*?)##" schien mir bisher am logischsten, funktioniert aber auch nicht...)
/edit: ok das Hauptproblem ist eher: wie bringe ich readLine() dazu, bis zum Zeilenende zu lesen, also Steuerzeichen zwischendurch trotzdem mitzunehmen?
Anhand eines Beispiels (mit Erklärung: was willst du als Ergebnis, was bekommst du etc.) ist so etwas denke ich immer besser erklärt und andere können viel besser helfen.
/edit: ok das Hauptproblem ist eher: wie bringe ich readLine() dazu, bis zum Zeilenende zu lesen, also Steuerzeichen zwischendurch trotzdem mitzunehmen?
Von welchen Steuerzeichen reden wir hier?
readLine:
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
Da kannst du nichts dran ändern. Wenn du also Zeilenumbrüche etc. "überlesen" möchtest bzw möchtest dass diese dann mit zu deinem String gehören und du eher bis zu den nächsten ## lesen willst (habe ich dich da überhaupt richtig verstanden?), würde ich dir den Scanner empfehlen mit DOTALL noch als Zusatz im Pattern, so dass wir dann also das Pattern "(?s)(.*?)##" haben.
Beispiel:
Java:
String strLine ="one##two####three##\nhallo welt\nfoobar\ntwo##two##";Scanner sc =newScanner(strLine);//hier dann natürlich nicht den Teststring nehmen, sondern dein Filewhile(sc.findWithinHorizon("(?s)(.*?)##",0)!=null){String s = sc.match().group(1);System.out.println(Arrays.toString(s.toCharArray()));//nur für Testzwecke ums besser zu verdeutlichen}
Mhm? Verstehe ich nicht, das ist doch das was du wolltest (Steuerzeichen mit in den String). Ist doch klar dass dann wenn du ein line terminator vor dem one hast und dann println machst, dass die dann in zwei Reihen dargestellt werden.
Wenn das nicht gewünscht ist und du hinterher halt die line terminators doch löschen willst, musst du eben nochmal replace aufrufen oder so.(s.trim() evtl...) ..:bahnhof:???:L
Das Problem ist halt, dass am Schluss jede Line ein bestimmtes Objekt repräsentieren wird. Und dafür müsste ich halt EndOfLine irgendwie erkennen. Deshalb hatte ich readLine() ursprünglich genutzt.
Also ich müsste halt noch irgendwie erkennen, dass nach "my teststring" eine newLine() beginnt...