2009-07-21 7 views
0

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}">&lt;{0}&gt;</ut> 

Meine Eingabe sieht wie folgt aus:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in: 
<ut DisplayText="\n">&lt;\n/&gt;</ut> {2}. 
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut> 

Die richtige Ausgabe dies sein sollte:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in: 
<ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>. 
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</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&lt;{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.

+0

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

+0

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. –

Antwort

0

Ich endete mit einer Kombination der Regex in der Frage und manuell beheben den ungeraden Fehler, der verursacht. Es war nicht ideal, aber es war schneller als der Versuch, die perfekte Lösung zu finden.

1

Lassen Sie mich wissen, wenn meine Annahme falsch ist, aber aus Ihrem Beispiel scheint es, Sie möchten Text ändern, der in {} und nicht in einem <ut> Element ist. Das scheint mir eine einfache Anwendung von XSLT zu sein. Geben Sie UT-Elemente einfach so aus, wie sie sind, und bearbeiten Sie dazwischen liegenden Text.

+0

Das ist richtig, plus das zusätzliche Element am Ende der Frage mit der ungewöhnlichen Syntax. – IanGilham

0

Warum nicht versuchen, den Ausdruck mit

(? < =.) {[A-Za-z0-9] +} (? =.$)

Dies würde das {mit 1 oder mehr Buchstaben oder Zahlen und} finden, wenn dieses Muster dem Tag und einer beliebigen Anzahl von Leerzeichen UND gefolgt von einer beliebigen Anzahl von Leerzeichen und einem Zeilenumbruch folgt.

+0

Ich habe ursprünglich etwas Ähnliches versucht, aber da die Variablen in den natürlichsprachlichen Text mit all seiner Mehrdeutigkeit und schlechten Formatierung fallen, deckt dies nicht alle Permutationen ab, in denen die Variablen erscheinen können. Weitere Informationen finden Sie im Update. – IanGilham

Verwandte Themen