2016-08-15 2 views
-1

Ich versuche, reguläre Ausdrücke in Sublime 3 zu verwenden, um den gesamten Inhalt zwischen zwei Zeichenfolgen, eine XML-Datei zu entfernen.Entfernen Sie den gesamten Inhalt zwischen zwei Zeichenfolgen mit regulären Ausdrücken

Angenommen, dies ist mein Gehalt ist:

 <Body name="ground"> 
      <mass>0</mass> 
      <mass_center> 0 0 0</mass_center> 
      <inertia_xx>0</inertia_xx> 
      <inertia_yy>0</inertia_yy> 
      <inertia_zz>0</inertia_zz> 
      <inertia_xy>0</inertia_xy> 
      <inertia_xz>0</inertia_xz> 
      <inertia_yz>0</inertia_yz> 
      <!--Joint that connects this body with the parent body.--> 
      <Joint /> 
      <VisibleObject> 
       <!--Set of geometry files and associated attributes, allow .vtp, .stl, .obj--> 
       <GeometrySet> 
        <objects /> 
        <groups /> 
       </GeometrySet> 
       <!--Three scale factors for display purposes: scaleX scaleY scaleZ--> 
       <scale_factors> 1 1 1</scale_factors> 
       <!--transform relative to owner specified as 3 rotations (rad) followed by 3 translations rX rY rZ tx ty tz--> 
       <transform> -0 0 -0 0 0 0</transform> 
       <!--Whether to show a coordinate frame--> 
       <show_axes>false</show_axes> 
       <!--Display Pref. 0:Hide 1:Wire 3:Flat 4:Shaded Can be overriden for individual geometries--> 
       <display_preference>4</display_preference> 
      </VisibleObject> 
      <WrapObjectSet> 
       <objects /> 
       <groups /> 
      </WrapObjectSet> 
     </Body> 

Jetzt nehme ich nur alle Inhalte zwischen <VisibleObject> und </VisibleObject> verlassen entfernen möge:

 <Body name="ground"> 
      <mass>0</mass> 
      <mass_center> 0 0 0</mass_center> 
      <inertia_xx>0</inertia_xx> 
      <inertia_yy>0</inertia_yy> 
      <inertia_zz>0</inertia_zz> 
      <inertia_xy>0</inertia_xy> 
      <inertia_xz>0</inertia_xz> 
      <inertia_yz>0</inertia_yz> 
      <!--Joint that connects this body with the parent body.--> 
      <Joint /> 
      <VisibleObject> 
      </VisibleObject> 
      <WrapObjectSet> 
       <objects /> 
       <groups /> 
      </WrapObjectSet> 
     </Body> 

Es gibt ein paar ähnlichen Themen und Probleme, zu dem oben genannten, aber keiner von ihnen scheint besonders gut (oder überhaupt) für dieses Problem zu arbeiten.

Jede Hilfe würde am meisten geschätzt werden.

+0

Wie wäre es mit Find '() [\ S \ s] *? ()', Ersetzen Sie $ 1 $ 2? – sln

+0

Mit Notepad ++ können Sie XSLT-Transformationen verwenden und beliebige XML-Dateien problemlos ändern. Nicht sicher, ob Sublime Text das Ändern von XML-Dateien mit XSLT unterstützt. –

+0

Tatsächlich, wie @ WiktorStribiżew erwähnt, kann dies leicht mit XSLT gehandhabt werden, indem eine Identitätstransformation ausgeführt wird und dann das '' - Element neu geschrieben wird. Außerdem wird dringend empfohlen, Regex nicht in [X/HTML-Dokumenten] zu verwenden (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags). – Parfait

Antwort

3

Ein Bild mit dem erhabenen Fenster:

Sublime Regex

Sie können es über finden finden, dann Ersetzen und stellen Sie sicher, dass Sie sich die äußeren linken Optionen ankreuzen.

1

Sublime erscheint PCRE zu verwenden, nach this page.

Das bedeutet, dass Sie sollten in der Lage, die coolen Tricks PCRE Angebote (meist negativ Vorgriff) zu verwenden. Dies kann die Leistung erheblich beschleunigen.

Die Regex Ich empfehle ist:

<VisibleObject>(?:[^<]*(?!</VisibleObject).)+</VisibleObject> 

Wesentliches der negativer Vorgriff sorgt dafür, dass immer dann, wenn ein < vorhanden ist (nämlich am Anfang eines Tags), es ist nicht die Schließung </VisibleObject>.

Die . wird benötigt, damit die Engine ein Zeichen zurückverfolgen kann, wenn das negative Look-Ahead das schließende Tag sieht.

Sie müssen den Ersatz <VisibleObject></VisibleObject> verwenden.

Verwandte Themen