3 Stimmen

Aufspalten einer Zeichenkette mit regulären Ausdrücken in .NET

Ich benötige einen regulären Ausdruck, mit dem ich eine Zeichenfolge untersuchen und bestimmte Elemente zurückgeben kann, wenn ich eine RegEx.Split() in .NET ausführe. Ich habe versucht, dies auf eigene Faust zu tun, aber ich kann nie scheinen, um zu bekommen, was ich brauche, und die Ergebnisse machen nie einen Sinn. Offensichtlich habe ich keine guten Kenntnisse im Schreiben regulärer Ausdrücke.

Hier ist also der String...

"%date - %-5level - [%thread] - %logger - %message - %exception%newline"

Ich möchte im Wesentlichen ein Array zurückerhalten, das wie das folgende aussieht:

"date"
"-5level"
"thread"
"logger"
"message"
"exception"
"newline"

Der folgende Code ist nahe dran, aber nicht ganz.

Regex exp = new Regex(@"\W+");
string[] s = exp.Split(@"%date - %-5level - [%thread] - %logger - %message - %exception%newline");

Ich erhalte die folgende Meldung:

""
"date"
"5level"
"thread"
"logger"
"message"
"exception"
"newline"

Aus irgendeinem Grund habe ich eine leere Zeichenfolge als ersten Index, und im 3. Index fehlt das "-". Ich nehme an, weil es nicht Teil eines "Wortes" ist.

Abgesehen von dem "-" möchte ich dann "5level" in ein Array aufteilen:

"5"
"level"

Ich habe damit experimentiert:

Regex exp2 = new Regex(@"(\d+)([a-zA-Z]+)");
string[] s2 = exp2.Split("5level");

Aber es gibt 2 Indizes mit leeren Zeichenfolgen zusätzlich zu den geteilten Elementen zurück, die ich so haben möchte:

""
"5"
"level"
""

Ich weiß nicht, wie ich den Ausdruck so formatieren kann, dass er mir das gibt, was ich brauche. Für jede Hilfe wäre ich dankbar.

4voto

Kobi Punkte 129985

Anstelle der Verwendung von Regex.Split ist es vielleicht einfacher, die benötigten Token zu finden:

MatchCollection matches = Regex.Matches(s, @"%([\w\-]+)");
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value).ToArray();

Split kann, wie Sie gesehen haben, leere Treffer hinzufügen, die herausgefiltert werden müssen.

0voto

Haroun Hajem Punkte 4432

Ein besserer Weg, dies zu tun, ist die Verwendung von Named Capturing Groups von RegEx Engine und zum Herausfiltern von leeren Übereinstimmungen in der Linq Abfrage.

MatchCollection matches = Regex.Matches(s, @"%(?<SomeName>[\w\-]+)");
string[] words = matches.Cast<Match>().Where(m => m.Length > 0 ).Select(m => m.Groups["SomeName"].Value).ToArray();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X