Ich habe mehrere tausend XML-Dateien aus Java-Eigenschaften Dateien für die Übersetzung im TTX-Format vorbereitet. Sie enthalten eine ganze Reihe von Variablen, die ich vor den Übersetzern schützen muss, da sie solche Dinge oft brechen. Die Variablen sind in Form von Zahlen oder gelegentlich Text zwischen einem Paar von geschweiften Klammern z. {0}, {dies}.Wie umschließt man Textmuster innerhalb von XML-Elementen, außer wenn es sich bereits in einem bestimmten XML-Element befindet?
Ich brauche diese Variablen mit einem XML-Element umgeben, wenn sie nicht bereits ein Attribut sind und wenn sie nicht bereits Teil des inneren Text eines ut Element, etwa so:
<ut DisplayText="{0}"><{0}></ut>
Meine Eingabe sieht wie folgt aus:
<ut Type="start"DisplayText="string"><string></ut> text string {0}
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> {2}.
<ut Type="end" DisplayText="resource"></resource></ut>
Die richtige Ausgabe dies sein sollte:
<ut Type="start"DisplayText="string"><string></ut> text string <ut DisplayText="{0}">{0}</ut>
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource"></resource></ut>
Meine erste Annäherung war, einen regulären Ausdruck zu verwenden, um den Begriff in den geschweiften Klammern zusammenzubringen und einfach die xml Elemente um ihn mit Musterersetzung aufzubauen. Dieser Ansatz schlägt fehl, wenn das Muster wie im obigen ersten Codeblock gefunden wurde.
zurück finden und prasselt ersetzen (in Notepad ++):
Finden
({[A-Za-z0-9]*})
ersetzen
<ut DisplayText="\1">\1</ut>
Es ist wie regex zu suchen beginnt, nicht das richtige Werkzeug für den Job, daher hätte ich gerne Vorschläge für bessere Ansätze, andere Werkzeuge oder einfach nur eine vollständigere Regex, die es mir erlauben, dies schnell und wiederholbar zu lösen.
Update: Das Problem erwies sich als ein wenig komplexer als bisher vorgesehen. Es scheint, dass es auch noch ein paar Dinge mehr gibt, die geschützt werden müssen, die eine ziemlich obskure Syntax beinhalten, bei der Variablen mit Text vermischt werden, was eine Art bedingte Aussage zu sein scheint. Aus dem Speicher:
{o,choice|1#1 error|1<{0,number,integer} errors}
Wo "Fehler" und "Fehler" sind übersetzbar und sollten nicht geschützt werden. Die einfachste Lösung, die wir derzeit haben, ist es, den oben genannten Regex auszuführen, die wenigen Fehler zu beheben, die er erzeugt, und dann ein paar mehr normale Suchen auszuführen, um die komplexeren Elemente zu ersetzen. Es könnte als Regex abstrahiert werden, aber im Moment ist das nicht viel sinnvoll.
Ich schätze die Zeiger auf xslt und andere Editoren mit besserer Regex-Unterstützung, zusätzlich zu den verbesserten Ausdrücken, die angeboten werden. Ich werde mit einigen der Optionen spielen, wenn die Zeit es erlaubt.
Ich habe das nicht getestet, also setze ich es in die Kommentare --- wenn das Datenformat einheitlich ist, warum nicht ein Lookahead/Lookbehind? So etwas wie das: (? Salty
Sie können dies mit Regexes, aber nicht Notepad ++ Regexen, anscheinend tun. Ihnen fehlen einige wichtige Funktionen, darunter auch Blickwinkel. Wäre es möglich, etwas anderes zu benutzen? Die Regex-Unterstützung von EditPad Pro ist erstklassig. –