Leerzeichen im Value zulassen

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

wieder mal ein Verständnisproblem.

Ich möchte ein Key / Value Paar aus einem String ermitteln welches durch ein '=' separiert ist.

Folgender Ausdruck:
C#:
(?'Key'\w+)\s*[=]\s*(?<delimiter>[""'])\s*(?'Value'\w+)\s*(?<delimiter>)

Folgender Text:
C#:
ServerName = "UA Local Discovery Server"

Im meinem C# Projekt erfolgt ein erfolgreich verlaufener Match.
Es kommt aber nur ein verstümmelter Wert zurück.

in Groups["Key"].Value kommt zurück: "ServerName".
in Groups["Value"].Value kommt zurück: "UA".
C#:
ServerName="UA

Sollte aber wie folgt aussehen:

in Groups["Key"].Value erwarte ich: "ServerName".
in Groups["Value"].Value erwarte ich: "UA Local Discovery Server".
C#:
ServerName="UA Local Discovery Server

Ich weiß nicht an welcher Stelle ich den Operator "\s*" platzieren soll.
Oder führt der Operator "\w+" nicht zum optimalen Ergebnis.


Nachfolgend der Link zu Test.

Mein Test

Gruß CopWorker
 

Yaslaw

alter Rempler
Moderator
Du hast da ein Durcheinander.
1) Wir haben glaub schon mal erwähnt, dass du am Ende nicht nochmals den Werte Delimiter auslesen kannst. Du musst ort den Wert des vorderen Delimiters einsetzen. \k<delimiter>
2) mal machst du die Namen in <> und mal in '' Entscheide dich für eine Schreibweise
3) Zu deinem Problem. [\w\s]+ ist das was du suchst. Text oder Leerzeichen
Code:
(?<Key>\w+)\s*[=]\s*(?<delimiter>[""'])\s*(?<Value>[\w\s]+)\k<delimiter>
 

Zvoni

Erfahrenes Mitglied
Bei so einfachem Kram wieso überhaupt RegEx?
feuer den String an die Split-Funktion mit "=" als Trennzeichen, und gut ist

EDIT: In den doc's ist sogar dieses Beispiel drin
String.Substring Methode (System)
Zweites Code-Beispiel zeigt Key/Value-pairs
 
Zuletzt bearbeitet:

CopWorker

Erfahrenes Mitglied
Hallo Yaslaw,

da hast du recht. Hab´s jetzt so drin mit dem delimiter.
Da ich den kompletten Text von "Value" benötige habe ich den Ausdruck so gestaltet:
C#:
(?<Key>\w+)\s*[=]\s*(?<delimiter>[""'])\s*(?<Value>[^$]+)\k<delimiter>
Ist dann das '+' nach der eckigen Klammer noch notwendig?

Noch was.
Kann ich die gefundenen delimiter am Ergebins vom Value dran lassen irgendwie?
Dann wäre das Ganze perfekt.

Vielen Dank für deine Hilfe.

Gruß von CopWorker
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

mit .split hatte ich zuvor gearbeitet.
Ungeschickt ist es nur wenn mehrere Zeichen nach denen gesplittet
wird im Text enthalten sein dürfen.

z.Bsp.:
Commentary = "1 = gut; 0 = nicht definert; -1 = Fehler"

Da ist .split und .substring schnell an seinen Grenzen.
Oder kann ich mit .substring definieren, dass nur nach einem (dem ersten) Vorkommen
von '=' gesplittet werden darf?

Vielen Dank trotzdem.
Grüße CopWorker.
 

Zvoni

Erfahrenes Mitglied
Schau dir doch das SubString-Beispiel aus dem Link an.
IndexOf gibt dir das erste Auftreten deines Trenners an, und Substring kannst du auf zwei Arten aufrufen:
1) StartPunkt + Länge. In deinem Fall 0 und IndexOf --> alles links vom "="
2) Nur Startpunkt. Die Länge ist dann der Rest des Strings. In deinem Fall IndexOf+1 --> alles rechts vom "="

EDIT: Und hier zum String.Split: String.Split Methode (System)
Da stehts. Zweiter Parameter.
In deinem Fall: MyString.Split('=',2)
Würde aber dennoch TrimEntries der Split-Options dazu nehmen
MyString.Split('=',2,StringSplitOptions.TrimEntries)
 
Zuletzt bearbeitet:

Yaslaw

alter Rempler
Moderator
Falls doch RegEx (ich würde es mit RegEx lösen, ist geschmacksache):
Code:
(?<Key>\w+)\s*[=]\s*(?<Value>(?<delimiter>[""'])[\w\s]+\k<delimiter>)
Also die Delimiter-Geschichte in den value reinnemen.
Das + nach [] bedeutet: Zuerst, [] bedeutet Ein Zeichen der Definitionen in dieser Klammer. Das +, mehrere Zeichen...
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni, hallo Yaslaw,

Den delimiter benötige ich nur um rauszufinden ob es sich im Value um eine Zahlenwert '23' oder um einen Text "dreiundzwanzig" handelt.
Ich werte zusäzlich noch den delimiter aus und gut ist.
C#:
strKey = mTemp.Groups["Key"].Value;
strValue = mTemp.Groups["Value"].Value;
strDelimiter = mTemp.Groups["delimiter"].Value;

Meine Meinung:
Mit RegEx kann ich mit einem 1 Zeiler eine Vielzahl von Parametern und Strukturierungen auswerten.
Vorausgesetzt man ist dieser Technik mächtig.

Jetzt geht alles so wie ich mir das vorgestellt habe.

Vielen Dank nochmals an euch alle.
Grüße von CopWorker
 

Zvoni

Erfahrenes Mitglied
Wozu brauchst du einen delimiter (in deinem Fall die Anführungszeichen) um herauszufinden ob ein String numerisch ist????
Identify if a string is numeric in C# – Techie Delight
Schmeiss die Anführungszeichen raus, und wende eins der genannten Verfahren direkt auf "value" an, da du ja nur ein Ja/Nein brauchst. Ohne C# jetzt zu kennen, würde ich Verfahren 1 oder 2 aus genanntem Link nehmen (für 1 die mit dem vorkompilierten RegEx).

Oder noch einfacher: Nehmen wir mal an dass strValue NIE Anführungszeichen hat
Convert.ToInt32(strValue)
Kann auch ToInt16, ToInt64 (sowie die Unsigned Schwestern) je nach verwendetem Bereich der numerischen Werte
Convert.ToInt32 Methode (System)

Sorry, dass es aussieht als ob ich darauf rumreite, aber ich bin nun mal ein Verfechter des KISS-Prinzips
("Keep It Simple Stupid"). So nen wüsten RegEx auf ein Key/Value pair ist für mich mit Atom-Rakete auf Spatzen geschossen