Wie Textmuster innerhalb XML-Elemente umschließen, es sei denn, es ist bereits in einem bestimmten XML-Elemente?

StackOverflow https://stackoverflow.com/questions/1160164

Frage

Ich habe mehrere tausend XML-Dateien aus Java-Eigenschaften erzeugen Dateien für die Übersetzung in dem TTX-Format vorbereitet. Sie enthalten eine ganze Reihe von Variablen, dass ich von den Übersetzern schützen müssen, da sie oft solche Dinge brechen. Die Variablen sind in Form von Zahlen oder gelegentlich zwischen einem Paar von geschweiften Klammern zB Text. {0}, {das}.

Ich brauche diese Variablen mit einem XML-Elemente umgeben, wenn sie nicht bereits ein Attribut sind und wenn sie nicht bereits Teil des inneren Textes eines sind 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 sollte sein:

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

Mein erster Ansatz war es, einen regulären Ausdruck zu verwenden den Begriff in den Klammern entsprechen und nur die XML-Elemente um es mit Mustern Substitution zu bauen. Dieser Ansatz schlägt fehl, wenn das Muster wie in dem ersten Codeblock oben vorhanden gefunden ist.

Zurück Suchen und Ersetzen prasselt (in Notepad ++):

Suchen

({[A-Za-z0-9]*})

Ersetzen

<ut DisplayText="\1">\1</ut>

Es beginnt wie regex zu sehen ist nicht das richtige Werkzeug für den Job, also würde ich einige Vorschläge für eine bessere Ansätze zu nehmen, verschiedene Werkzeuge mögen, oder auch nur eine vollständigere regex, die mir erlauben kann dies schnell zu lösen und wiederholbar.

Update: Das Problem stellte sich heraus, ein wenig komplexer zu sein als bisher in Betracht gezogen. Es scheint, gibt es auch noch ein paar Dinge, die den Schutz benötigt, einige eher obskure Syntax beteiligt, Variablen mit Text in das Mischen, was scheint, eine Art bedingte Anweisung zu sein. Aus dem Gedächtnis:

{o,choice|1#1  error|1&lt;{0,number,integer} errors}

Wenn „Fehler“ und „Fehler“ übersetzbar sind und nicht geschützt werden sollten. Die einfachste Lösung, die wir derzeit haben, ist es, die oben regex, fixieren Sie die ungeraden wenige erros laufen sie schafft und dann noch ein paar normale Fund laufen und ersetzen Pässe für die komplexeren Produkte. Es könnte als regex abstrahiert, aber jetzt gibt es nicht viel Sinn, das zu tun.

Ich schätze die Zeiger auf XSLT und anderen Editoren mit besserer regex Unterstützung, zusätzlich zu dem verbesserten Ausdrücke angeboten. Ich werde ein Spiel mit einigen der Optionen, wenn die Zeit erlaubt.

War es hilfreich?

Lösung 3

endete ich in der Frage mit einer Kombination aus der Regex und manuell die ungeraden Fehler Fixierung, die verursacht. Es war nicht ideal, aber es war schneller als zu versuchen, die perfekte Lösung zu finden.

Andere Tipps

Lassen Sie mich wissen, ob meine Annahme falsch ist, sondern aus Ihrem Beispiel scheint es, Sie Text ändern mögen, die in {} ist und nicht in einem Elemente. Mir scheint dies wie eine einfache Verwendung von XSLT. Einfach Ausgang UT Elemente, wie sie einen beliebigen Text dazwischen sind und verarbeiten.

Warum nicht versuchen, den Ausdruck mit

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

Dies würde die {mit 1 oder mehr Buchstaben oder Zahlen und die} finden, wenn dieses Muster das Tag und eine beliebige Anzahl von Leerzeichen folgt und von einer beliebigen Anzahl von Räumen und einem Zeilenumbruch gefolgt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top