2017-06-14 2 views
-4

Ich habe eine XML-Ausgabe, wie untenregex kombinieren Tags

<B-company> The British </B-company> <I-company> Broadcasting Corporation is a </I-company> <B-Type> public </B-Type> <I-Type> service broadcaster </I-Type> <HQ> headquartered </HQ> <B-company> at </B-company> <I-company> Broadcasting </I-company> <B-Type> House </B-Type> <I-Type> in </I-Type> <HQ> London </HQ> 

Hier B-Tag gezeigt repräsentieren Tag Begin und I-Tag zeigt Fortsetzung tag/End-Tag (wenn kein weiterer I-Tag gefunden wird).

Ich suche so etwas wie dies als eine Ausgabe

<company> The British Broadcasting Corporation is a </company> <Type> public service broadcaster </Type> <HQ> headquartered </HQ> <company> at Broadcasting </company> <Type> House in </Type> <HQ> London </HQ> 

dh die Notwendigkeit Zeichen ‚B‘ aus dem ersten Tag entfernt werden, wodurch und alle Tags, bis wir ‚/ I-‘ haben Tag und fügen Sie am Ende hinzu. Wie erreichen wir das in Java Regex?

+1

[Verwenden Sie stattdessen einen XML-Parser?] (Https://Stackoverflow.com/a/1732454/2773311) Etwas über das Parsen von XML/HTML mit Regexes ... – Arc676

+1

@ Arc676 Es kann kaum als "Parsing" bezeichnet werden, wenn das Ausgabe ist XML. Diese sehen wie grundlegende Zeichenfolgenoperationen aus, nur dass die Zeichenfolge xml ist. –

+1

@Rawing, du hast Recht. Es sind nur einfache Strings, die mit einigen Tags versehen sind. Es folgt nicht der normalen XML-Konvention. Die Verwendung von XML-Parser scheint mir ein Overkill dafür zu sein. Daher der Regex-Ansatz – Betafish

Antwort

1

können Sie diese Regex versuchen:

</[BI]-(\w+)>\s*<I-\1>|(</?)[BI]-(\w+>) 

und ersetzen mit \2\3.

Online demo.


Was es tut:

</[BI]-(\w+)>\s*<I-\1> entspricht einem schließenden Tag sofort durch eine Fortsetzung Tag gefolgt. Keiner dieser Texte wird in den Gruppen 2 oder 3 erfasst. Daher wird der gesamte Text, der dazu passt, entfernt.

(</?)[BI]-(\w+>) entspricht dann den restlichen Tags, die mit B- oder I- beginnen. Er fängt den Text um die B- oder I- in den Gruppen 2 und 3 ein, so dass durch \2\3 die B- oder I- effektiv entfernt wird.

+0

Die Online-Demo-Site hat sehr geholfen. Es war etwas, auf das ich meine naiven Regex-Fähigkeiten anwenden wollte. – Betafish