Uwe: Validierung mit Regex endet bei einem Mismatch in Endlosschleife

Beitrag lesen

Hallo Oliver

Ich habe zwar von Java kaum Ahnung, arbeite aber unter Perl viel mit regulären Ausdrücken. Deinem Beispiel nach werden unter Perl und Java Regex sehr ähnlich benutzt. Daher äußere ich mich mal zum Problem.

Die Endlosschleife könnte damit zusammenhängen, dass Java verzweifelt versucht, einen Ausdruck in deinem String zu finden, der zur Regex passt. Da es hierfür beim ersten Beispiel wegen der äußeren Klammer schier unerschöpflich viele Möglichkeiten gibt (die alle getestet werden müssen, bevor feststeht, dass das Gesuchte wirklich nicht vorkommt), dauert das Ganze eine halbe Ewigkeit.

In Perl würde ich das Problem wie folgt lösen:
/^([\w \r\n.?!,-]?($[VERSION]|$[NAME])*[\w \r\n.?!,-]?)*$/
Ich lasse Perl also nach einem Ausdruck suchen, der mit einem der zulässigen Zeichen oder keinem Zeichen anfängt (falls $[VERSION] oder $[NAME] am Stringanfang stehen), dann kann entweder $[VERSION] oder $[NAME] folgen, muss aber nicht, und dann wieder eines der zulässigen Zeichen oder kein Zeichen. Dieser ganze Ausdruck kann zwischen Stringanfang (das ^) und Stringende ($) beliebig oft, also auch keinmal (leerer String passt bei dieser Regex auch), vorkommen. Der Trick an der Sache ist nun, dass zwischen Stringanfang und -ende keine Zeichen zulässig sind, die nicht auf das Suchmuster zwischen den beiden äußeren Klammern passen.

Noch drei Anmerkungen, die mir beim Testen aufgefallen sind und möglicherweise auch für Java gelten:
1.) \w passt auf alle Buchstaben und den Unterstrich! Falls du den Unterschrich nicht zulassen willst, musst du A-Za-z anstelle von \w verwenden
2.) Umlaute und ß dürfen nicht vorkommen, da sie nicht als Buchstaben gelten. Falls sie zugelassen werden sollten, sind sie seperat anzugeben ([öÖäÄüÜß\w \r\n.?!,-])
3.) $[ interpretiert Perl aus irgend einem Grund als Sonderzeichen. Da ich einen Teststring direkt einer Variable zugewiesen habe, musste ich $ maskieren. Bei Java oder Eingabe des Strings per Tastatur mag das anders aussehen. Auch unmaskierte $, welche von anderen Zeichen gefolgt werden, haben bei meinem Test Probleme gemacht. (Wieso? Keine Ahnung)

Vielleicht hilft dir das weiter, auch wenn ich nur mit Perl getestet habe.

Viele Grüße

Uwe