2009-05-05 7 views
0

Wie üblich, verursachen regelmäßige Ausdrücke meinen Kopf zu verletzen.Regulärer Ausdruck, um XAML Binding-esque Syntax zu analysieren

Ich habe die folgenden Zeichenfolgen (als Beispiele), die Ich mag würde analysieren:

Client: {Path=ClientName}, Balance: {Path=Balance, StringFormat='{0:0.00}'} 
Client: {Path=ClientName}, Balance: {Path=Balance, StringFormat='Your balance is {0:0.00}.'} 

Ich bin für einen regulären Ausdruck suchen (oder einem anderen Verfahren), die die Strings aufgeteilt könnte wie folgt und dann bekommen die einzelnen Schlüssel/Wert-Werte von jedem. (Die Idee ist, jede dieser zu einem XAML zu lösen Bindung)

String 1: {Path=ClientName} 

    Path = ClientName 

String 2: {Path=Balance, StringFormat='{0:0.00}'} 

    Path = Balance 
    StringFormat = {0:0.00} 

Im Moment habe ich den folgenden regulären Ausdruck haben die Saiten zu spalten, aber diese wird durch den Wert der String aufgrund der verwirrt ‚}‘ im Wert.

(?<!'){(.+?)}(?!') 

Irgendeine Idee, wie ich das erreichen kann?

Danke!

+0

Wie oft ist Regex nicht wirklich das beste Werkzeug für diesen Job. Gibt es einen Grund, warum es mit Regex gemacht werden muss? –

+0

Um ehrlich zu sein, ich habe einfach angenommen, dass es mit Regex * gemacht werden könnte und es war nur meine Unwissenheit über das Thema im Weg. Ich bin wirklich offen für irgendwelche Vorschläge! –

+0

Es * kann * mit einer Regex gemacht werden, aber das ist die faule Hack-Lösung. Es gibt bessere Tools für den Job, aber ein Regex wird wahrscheinlich für die meisten Zwecke "gut genug" sein. –

Antwort

1

Es wird wirklich anstrengend das gleiche Problem immer und immer wieder zu lösen, aber hier geht:

Technisch Sie es falsch zu machen, sollten Sie einen Parser verwenden, werden reguläre Ausdrücke nicht gebaut mit verschachtelten umgehen Passende Klammern, blah blah blah. Wir können diesen jedoch zusammen hacken, also warum nicht?

/(?<!'){([^'}]|'[^']+')+}(?!')/ 

Das Fleisch, dass - {([^'}]+|'[^']+')} - sieht für zwei Dinge: a) alles, was nicht ein } oder einen ' Charakter ([^'}]) ist, und b) etwas, das wie ein String aussieht ('[^']+'). Es wird angenommen, dass eine Zeichenfolge ein Zitat, ein Bündel von Nicht-Angebotstext und ein anderes Zitat ist. Angesichts Ihrer Beispiele sollte dies funktionieren.

Es wird jedoch nicht mit 'This is a string with \'quotes\' in it' übereinstimmen, da es nicht für Escapezeichen entworfen wurde. Das Hinzufügen ist einfach und beinhaltet das Anwenden der Prinzipien, die wir gerade angewendet haben, also überlasse ich es Ihnen, herauszufinden, ob Sie es können. Du scheinst ziemlich gut mit regulären Ausdrücken umzugehen, und du hast zumindest damit angefangen, bevor du es gefragt hast, also denke ich, dass du herausfinden kannst, wie man es mit \' in einer Zeichenkette zusammenbringt.

BEARBEITEN: Sie verwenden ' s statt " s. Das tut mir leid.

+0

Ja! Danke, das scheint zu funktionieren! –

+0

Kein Problem. Ich schlage vor, Sie lesen etwas über die theoretischen Einschränkungen von regulären Ausdrücken. Regexes können eine Zeichenfolge mit Anführungszeichen innerhalb (d. H. '\' '), Aber nicht mit Klammern innerhalb von Klammern (d. H. {{} {}}) Abgleichen. Wenn der Text, den Sie analysieren möchten, viel komplizierter wird (insbesondere in Form von verschachtelten Klammern), sollten Sie eine andere Lösung finden. Moderne Regexes können das, aber es ist hacky und unnötig schwierig, richtig zu schreiben/lesen/zu warten/zu aktualisieren. –

Verwandte Themen