| 

.NET C# Java Javascript Exception

4
Hi,

ich habe eine REG Datei vorliegen, die ich via C# parsen muss. In der REG Datei habe ich bisher folgende grundsätzliche Konstellationen feststellen können:

@="Dies ist der Default Value vom Nikolaus."
"StringValue"="Dies ist das string Haus vom Nikolaus."
"BinaryValue"=hex:42,34,24,3e,21,30,9e,fd,20,29,85,e9,80,33,f0,59,e3,21,09,e4,\
3d,90,12,34,53,24,14,75,63,42,54,15,63,45,32,45,70
"DWordValue"=dword:0000024f
"MultiStringValue"=hex(7):44,00,69,00,65,00,73,00,20,00,69,00,73,00,74,00,20,\
00,64,00,61,00,73,00,00,00,4d,00,75,00,6c,00,74,00,69,00,73,00,74,00,72,00,\
69,00,6e,00,67,00,00,00,48,00,61,00,75,00,73,00,20,00,76,00,6f,00,6d,00,20,\
00,4e,00,69,00,6c,00,6f,00,6b,00,61,00,75,00,73,00,2e,00,00,00,00,00
"ExpandableStringValue"=hex(2):44,00,69,00,65,00,73,00,20,00,69,00,73,00,74,00,\
20,00,64,00,61,00,73,00,20,00,45,00,78,00,70,00,61,00,6e,00,64,00,61,00,62,\
00,6c,00,65,00,20,00,48,00,61,00,75,00,73,00,20,00,76,00,6f,00,6d,00,20,00,\
4e,00,69,00,6b,00,6f,00,6c,00,61,00,75,00,73,00,2e,00,00,00
"QWordValue"=hex(b):4f,20,6c,fe,ef,f7,f1,3e


Ich bin jetzt durch die Reg Datei gegangen und lese jeden Wert in einen String Value ein und löse die Zielenumbrüche dabei auf. Nun war mein erster Ansatz, dass ich einfach beim ersten Auftreten eine '='-Zeichen den string aufsplitte:
string[] valuePair=strLine.Split('=')

Grundsätzlich keine so gute Idee, da ja jemand auf die Idee kommen könnte, in den Name ein Gleichheitszeichen aufzunehmen. Beispiel:
"test=testName"="testValue"

Noch fieser wird das, wenn irgendein Wahnsinniger auf die Idee kommt, einen Type Identifier in den Namen aufzunehmen (was von regedit.exe tatsächlich sowohl beim import als auch beim export unterstützt ist):
"test\"=hex(2):testName"="testValue"


Wie kann ich nun wirklich sicher erkennen, was in diesem string der Name, und was der Value ist?

Gruss Dave
28.08.2012
david.koenig09 173 6
2 Antworten
6
Der folgende Ausdruck sollte das tun was du willst. Ich hab ihn mit allen deinen Beispielen getestet:

(?<=^".*?(?<!\\)")=


Beispiel:

string[] SplitArray = 
Regex.Split(sourceString, "(?<=^\".*?(?<!\\\\)\")="
, RegexOptions.Singleline | RegexOptions.Multiline);


Erklärung:

// (?<=^".*?(?<!\\)")=
//
// Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=^".*?(?<!\)")»
// Assert position at the start of the string or after a line break character «^»
// Match the character """ literally «"»
// Match any single character «.*?»
// Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
// Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\)»
// Match the character "\" literally «\»
// Match the character """ literally «"»
// Match the character "=" literally «=»
28.08.2012
Floyd 14,6k 3 9
+1
wow Floyd, RegEx-Genie :)
Ich hab mich auch dran versucht, aber so sicher bin ich im Umgang mit RegEx noch net.
Karill Endusa 28.08.2012
Danke für die Blumen.
Der trick in diesem Fall sind die beiden Lookaround's die durch "(?" eingeleitet werden aber nicht in den gemachten Teil einfließen. Damit kann man Bedingungen definieren, wie z.B. "wird gefolgt von / wird nicht gefolgt von" oder "davor steht / davor steht nicht".
Der Ausdruck: (?<!\\)" bedeutet, ein Anführungszeichen (") dem kein Backslasch vorran steht.
Mehr Infos zu Lookarounds findest du unter: http://www.regular-expressions.info/lookaround.html bzw. per Frage hier auf CK ;)
Floyd 28.08.2012
ah wenn ich die seite grad richtig verstanden habe nutzt du in dem hier angegebenen RegEx ein negatives Lookbehind in einem positiven Lookbehind?
Verdammt, ich wusst ja dass RegEx ein extremes "Powertool" ist, aber das kannt ich halt auch noch nich :D
Karill Endusa 28.08.2012
Richtig erkannt. :) Das negative lookbehind im inneren für die Escape-Sequenz, und das positive lookbehind dafür, dass der gesammte Ausdruck vor dem Gleichheitszeichen stehen muss und zudem nicht in den eigentlichen Match aufgenommen wird.
Floyd 28.08.2012
+1, sehr kompakt. Und sehr gut erklärt.
ffordermaier 28.08.2012
Supercool, vielen Dank. Das hat mir extrem weitergeholfen. Hätt ich ich mal gleich gefragt ;-)
david.koenig09 29.08.2012
@david.koenig09: Sei doch dann bitte so gut und klick auf den grünen Haken bei Floyds Antwort. Danke!
ffordermaier 29.08.2012
Danke :) @david & ffordermaier
Floyd 31.08.2012
0
Aaah, den habe ich glatt übersehen. Danke für den Hinweis.
31.08.2012
david.koenig09 173 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH