Reguläre Ausdrücke zum Splitten von Strings mit Trennzeichen, das im Text doppelt vorkommt

Programmierer kommen auf seltsame Ideen. Zumindest wirken diese auf den erste Blick so. Eine Zeichenkettenausgabe enthält Strings in mehreren Sprachen mit einem Semikolon als Trennzeichen. Kommt im Textein Semikolon vor, wird dies verdoppelt. Zum Abgrenzen der Locale und des eigentlichen Textes kommt ein  @ zum Einsatz, welches ebenso verdoppelt wird, sollte es im Fließtext vorkommen.

Möchte man diese Konstellation nach den Sprachen auftrennen, kommt man mit der normalen String.Split()-Methode nicht weit. Auch einfache reguläre Ausdrücke scheitern, da immer auch ein Semikolon aus dem gedoppelten matcht. Abhilfe schafft eine Kombination aus non-zero negative lookahead und non-zero negative lookbehind:

Format einer Sprachvariante:

String input = "de-DE@Text;";

Format mit mehreren Sprachen

String input = "de-DE@Text;en-EN@text;";


Format mit mehreren Sprachen und ;; bzw @ im Fließtext

String input = "de-DE@Text;;mit Semikolon;en-EN@text;;with semicolon;";

Folgender reguläre Ausdruck splittet die einzelnen Sprachen:

String[] result = Regex.Split("de-DE@Text;;mit Semikolon;en-EN@text;;with semicolon;""(?<![;])(?!(;;))[;]{1}");

Als Ergebnis erhält man:
[0] de-DE@Text;;mit Semikolon
[1]
en-EN@text;;with semicolon
Genauso verfährt man mit det Trennung von Locale und Fließtext:
String[] result2 = Regex.Split("en-US@fdgsdfa@@fagardg""(?<![@])(?!(@@))[@]{1}");

 

Zusätzliche Informationen