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?
// (?<=^".*?(?<!\\)")= // // 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 «=»
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 ;)
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
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.
wow Floyd, RegEx-Genie :)
Ich hab mich auch dran versucht, aber so sicher bin ich im Umgang mit RegEx noch net.