FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java --> richtige RegExp gesucht

Java --> richtige RegExp gesucht 2006-11-17 00:22
Zaphod
Ich bin gerade zu müde, um den richtigen Ausdruck zu finden.

Mit String.split(regexp) will ich den folgenden Ausdruck

unl, 20, 30, 10, 11

in ein Array einlesen, welches dann so aussehen soll:

[unl, 20, 30, 10, 11]

Nicht funktionieren tut es mit

zerstueckelteLine = line.split("\\s");

Hat jemand ne Idee oder alternativ Kaffee? ;-)

Sonst muss ich doch noch mal den Tokenizer ausbuddeln..

Re: Java --> richtige RegExp gesucht 2006-11-17 00:32
UncleOwen
line.split(", ") wuerd ich mal sagen (wenn immer genau ein Komma und ein Leerzeichen zwischen 2 Eintraegen sind)

Re: Java --> richtige RegExp gesucht 2006-11-17 00:44
Zaphod
line.split(", ") wuerd ich mal sagen (wenn immer genau ein Komma und ein Leerzeichen zwischen 2 Eintraegen sind)

Sind nicht immer gleichviele (also 1 Komma und unterschiedlich viele Leerzeichen). Klappt aber trotzdem. [img]http://www.fb18.de/gfx/23.gif[/img]

Danke!

Re: Java --> richtige RegExp gesucht 2006-11-17 08:56
Wolf
Kannst vorher ja noch ein
line.replaceAll("[ \t]*", ""); machen, um Leerzeichen und Tabs loszuwerden, um danach nur nach Kommata zu splitten.

Re: Java --> richtige RegExp gesucht 2006-11-17 13:22
Popcorn
zerstueckelteLine = line.split("\\s");
Nach mir bekannten Konventionen aus php/perl (mag ja in Java anders sein), müsste so auch \s im Text stehen, weil das erste \ Die Sonderfunktion des zweiten \ aushebelt und es von einem Metazeichen, in ein normales wandelt.

Re: Java --> richtige RegExp gesucht 2006-11-17 13:40
UncleOwen
Da steht ja auch \s. \\ muss man nur schreiben, weil \ in Strings escaped werden muss. Was Du meinst, waere in Java "\\\\".

Re: Java --> richtige RegExp gesucht 2006-11-17 13:56
FireTiger
Kannst vorher ja noch ein
line.replaceAll("[ \t]*", ""); machen, um Leerzeichen und Tabs loszuwerden, um danach nur nach Kommata zu splitten.
Oder ein .trim() auf die jeweiligen Teilstrings anwenden…

Re: Java --> richtige RegExp gesucht 2006-11-17 14:38
Zaphod
Also bei Tageslicht betrachtet gefällt mir Wolfs Lösung doch am besten :-)
Danke nochmals!

Re: Java --> richtige RegExp gesucht 2006-11-17 14:40
Popcorn
Da steht ja auch \s. \\ muss man nur schreiben, weil \ in Strings escaped werden muss. Was Du meinst, waere in Java "\\\\".
Wie gesagt, keine Ahnung von Java. In meinen Perl und PHP-Skripten steht in entsprechender Stelle nur \s und funktioniert wunderbar ohne esacpen. Weil ich dann ja gerade will, dass nach dem Metazeichen \s gesucht wird und nicht nach einem Backslash gefolgt von einem s.

Bei Wolf siehst Du ja auch keinen Escapezeichen vor dem Backslash. :)

Re: Java --> richtige RegExp gesucht 2006-11-17 14:59
Slater
naja, ohne Kenntnisse sollte man bei Widerspruch nicht nachhaken ;)

\t ist ein nichtdarstellbares Zeichen für Tab,
\s ist was ganz anderes, ein Symbol der RegEx-Sprache bestehend aus \ und s,
wenn man \s in Java schreibt meckert allein schon der Compiler (invalid escape sequence)

daher \\ für \ und s für s

Re: Java --> richtige RegExp gesucht 2006-11-17 15:06
Popcorn
naja, ohne Kenntnisse sollte man bei Widerspruch nicht nachhaken ;)

\t ist ein nichtdarstellbares Zeichen für Tab,
\s ist was ganz anderes, ein Symbol der RegEx-Sprache bestehend aus \ und s,
wenn man \s in Java schreibt meckert allein schon der Compiler (invalid escape sequence)

daher \\ für \ und s für s
Das will ich doch gar nicht bestreiten, dass es so unter Java sein mag. Ich habe extra gesagt, dass ich da keine Ahnung habe. Es war zu dem Zeitpunkt nur ein Hinweis dazu, wie es etwa mit PHP wäre. Probiere ruhig selbst aus, wenn Du mir nicht glaubst:

<?php $entry = "Eins Zwei"; print preg_replace("|\s|", "TRILL", $entry); ?>
–> EinsTRILLTRILLZwei

Wer es dann noch nicht glaubt, dem kann ich auch nicht mehr helfen. [img]http://www.fb18.de/gfx/17.gif[/img]

Re: Java --> richtige RegExp gesucht 2006-11-17 17:40
guiltyguy
Warum antwortest Du denn in einem Java Thread, wenn Du selbst sagst, Du hättest von Java keine Ahnung? [img]http://www.fb18.de/gfx/25.gif[/img]

Re: Java --> richtige RegExp gesucht 2006-11-17 17:48
Anonymer User
", *" erscheint mir am unkompliziertesten… Wenn es auch tabs sind, dann halt ",[ \t]*"

Re: Java --> richtige RegExp gesucht 2006-11-17 17:49
Popcorn
Warum antwortest Du denn in einem Java Thread, wenn Du selbst sagst, Du hättest von Java keine Ahnung? [img]http://www.fb18.de/gfx/25.gif[/img]
Weil probieren nix kostet und vielleicht ja auch die Lösung hätte sein können. [img]http://www.fb18.de/gfx/17.gif[/img]

Re: Java --> richtige RegExp gesucht 2006-11-18 03:55
Wolf
", *" erscheint mir am unkompliziertesten… Wenn es auch tabs sind, dann halt ",[ \t]*"
Ich wage mal zu behaupten, dass das teurer ist, als temporär Whitespaces zu entfernen. Außerdem fängt es keine Whitespaces am Beginn und am Ende des Strings ab.

Re: Java --> richtige RegExp gesucht 2006-11-18 13:12
tekai
ansonsten der Hinweis das es auch Tokenizer gibt zusammen mit trim spart man sich dann die Regulären Ausdrücke.

Re: Java --> richtige RegExp gesucht 2006-11-20 13:59
cheek
nur das tokenizer soweit ich weiss ncht mit anderen locales klar kommt, deswegen soltle man die nur in bestimmten faellen benutzen,
ansonsten ersetze generell erst die whitespaces und splitte dann da du ein variables format hast macht das denke ich auch mal am meisten sinn


gruss
cheek

Re: Java --> richtige RegExp gesucht 2006-11-20 16:49
Anarch
Ich wage mal zu behaupten, dass das teurer ist, als temporär Whitespaces zu entfernen.

Unterschätze niemals die Macht der Speicherallokation. Aber das ist erstmal irrelevant – vorzeitige Optimierung ist meistens eine schlechte Idee. Insofern sollte man nehmen, was deutlicher macht, worum es geht.

Außerdem fängt es keine Whitespaces am Beginn und am Ende des Strings ab.

Die Frage ist, ob das gewünscht ist oder nicht. Oder ob eventuell innerhalb der Einträge auch Whitespace vorkommen darf – deine Lösung würde diesen nämlich auch löschen. Insofern ist das Problem unterspezifiert.

Re: Java --> richtige RegExp gesucht 2006-11-20 21:24
Wolf
Rein prinzipiell:

Ich habe das uneindeutige Problem an Hand des beispielhaften Datums auf ein mir verständliches eindeutiges Problem gemappt. Schließlich wissen wir ja nicht genau, was für Daten er wirklich hat und welche er als Resultat haben will, aber die Indizien waren deutlich.
Ich hab das so verstanden, dass er Zeichenketten ohne Whitespaces, die durch Kommata getrennt sind, in ein String[] ballern will. Dann passt das schon.

Es will nicht immer Jeder die godlike Lösung haben, die alles kann. Ich zum Beispiel schreibe gerade Parser, die ähnliche Daten erfassen und diese dann in Objekte nach Typ umwandeln (z.B. wird "1.4253;123.11" zu Float[]{Float.valueOf("1.4253"),Float.valueOf("123.11")}). Natürlich kannst Du meinen Algorithmus mit dieser oder jener Textdatei gegen die Wand fahren, das spielt aber keine Rolle, weil meine Eingabedateien aus einem Programm stammen, das beim Exportieren automatisiert gleichförmige Textdateien erstellt. Leerzeichen und Tabs müssen da auch weg, das macht das Parsen und Umwandeln trivial.

Edit: War bezogen auf 'vorzeitige Optimierung -> bad' – trifft hier nicht zu, wie Du sicher einsiehst [img]http://www.fb18.de/gfx/24.gif[/img]

Re: Java --> richtige RegExp gesucht 2006-11-20 22:15
Anarch
Edit: War bezogen auf 'vorzeitige Optimierung -> bad' – trifft hier nicht zu, wie Du sicher einsiehst [img]http://www.fb18.de/gfx/24.gif[/img]

Dein Beitrag argumentiert nicht für oder gegen eine Optimierung, sondern dafür, dass deine Interpretation des Problems auch richtig sein könnte. Dagegen sagte ich nichts. Und nein, ich sehe nicht ein, inwiefern das dafür spricht, dass du mit dem Argument „erst Whitespaces entfernen, dann splitten, weil das Andere teurer ist“ keine vorzeitige Optimierung durchführst.

Re: Java --> richtige RegExp gesucht 2006-11-21 09:22
Anonymer User
nur das tokenizer soweit ich weiss ncht mit anderen locales klar kommt, deswegen soltle man die nur in bestimmten faellen benutzen,
Da hier nur nach Leerraum oder Kommas gesucht wird, sollte dass nicht von den Locales abhängen. Ich fand den Tokenizer aber auch schon öfters eher unpraktisch in der Benutzung und verwende diesen deswegen selten.

ansonsten ersetze generell erst die whitespaces und splitte dann da du ein variables format hast macht das denke ich auch mal am meisten sinn
Ich würde einfach "unl, 20, 30, \t 10, \n 11".split("\\s*,\\s*") verwenden. Das ist einfach und kann mit beliebigem (Art und Anzahl) Leerraum vor und nach dem Komma umgehen. Man sollte bei split nur beachten, dass leere Strings am Ende verworfen werden, ggf. split(regex, -1) verwenden.

Falls man noch etwas besser auf die unterschiedlichen Unicode-Spaces eingehen will, dann kann man statt \s auch \p{javaMirrored} verwenden, was dann auf Character#isWhitespace(char) zurückgreift.

Re: Java --> richtige RegExp gesucht 2006-11-21 12:20
Wolf
Edit: War bezogen auf 'vorzeitige Optimierung -> bad' – trifft hier nicht zu, wie Du sicher einsiehst [img]http://www.fb18.de/gfx/24.gif[/img]

Dein Beitrag argumentiert nicht für oder gegen eine Optimierung, sondern dafür, dass deine Interpretation des Problems auch richtig sein könnte. Dagegen sagte ich nichts. Und nein, ich sehe nicht ein, inwiefern das dafür spricht, dass du mit dem Argument „erst Whitespaces entfernen, dann splitten, weil das Andere teurer ist“ keine vorzeitige Optimierung durchführst.
Ich optimiere vorzeitig, aber es ist nicht schlecht, das wollte ich sagen :)
Ich denke, wir sind uns einig, dass es immer abhängig vom vorliegenden Problem ist.
Ich fand den Tokenizer aber auch schon öfters eher unpraktisch in der Benutzung und verwende diesen deswegen selten.
Er ist sehr praktisch, wenn Du schrittweise parsen willst, aber nicht buchstabenweise und die Trennzeichen sich von Schritt zu Schritt ändern. Ein Beispiel, wo er sich geradezu aufdrängt:
Association Structure { 1.44;1.55;1.66;,1.77;1.88;1.99;,2,-1,-1;,0;; // Base Set 4:1,2,3,4;3:5,6,7;2:8,9;1:10;; // Association 1,2,3,4;; // Order }
Character#isWhitespace(char)
Sind da nicht auch LF und CR drin? Mir war so.. Kommt also mal wieder darauf an, was man haben will.

Re: Java --> richtige RegExp gesucht 2006-11-21 15:09
Anonymer User
Ich fand den Tokenizer aber auch schon öfters eher unpraktisch in der Benutzung und verwende diesen deswegen selten.
Er ist sehr praktisch, wenn Du schrittweise parsen willst, aber nicht buchstabenweise und die Trennzeichen sich von Schritt zu Schritt ändern.
OK, für Deine Anwendung mag er praktisch sein.

Mir war oft die Einschränkung im Weg, dass man als Trenner beim Tokenizer nur eine Zeichenmenge angeben kann. Und schrittweises Vorgehen ist mit RegExps eben auch recht leicht - und mächtiger.

Character#isWhitespace(char)
Sind da nicht auch LF und CR drin? Mir war so.. Kommt also mal wieder darauf an, was man haben will.
Ja, und ja.

LEIFer - zuvor die Unterschrift vergessen