2016-08-15 3 views
-1

Я пытаюсь использовать регулярные выражения в возвышенном 3, чтобы удалить все содержимое между двумя строками, XML-файлом.Удалить все содержимое между двумя строками с помощью регулярных выражений

Пусть это мое содержание:

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

Теперь предположим, что я хочу, чтобы удалить все содержимое между <VisibleObject> и </VisibleObject> оставить только:

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

Есть несколько подобных потоков и проблемы, к вышеизложенному, но ни один из них не работает особенно хорошо (или вообще) для этой проблемы.

Любая помощь была бы очень признательна.

+0

Как насчет поиска '() [\ S \ s] *? ()', Заменить '$ 1 $ 2'? – sln

+0

С Notepad ++ вы можете использовать XSLT-преобразования и легко изменять любой XML. Не уверен, поддерживает ли Sublime Text изменение XML-файлов с помощью XSLT. –

+0

Действительно, как упоминает @ WiktorStribiżew, это можно легко обработать с помощью XSLT, выполняющего преобразование идентичности, а затем перезаписывая элемент ''. Кроме того, настоятельно рекомендуется не использовать регулярное выражение в [X/HTML-документах] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags). – Parfait

ответ

3

Изображение с возвышенным окном:

Sublime Regex

Вы можете найти его с помощью Найти, затем Заменить и убедитесь, что вы отметите самый внешние левые варианты.

1

Sublime, как представляется, использовать PCRE, согласно this page.

Это означает, что вы должны быть в состоянии использовать крутые трюки PCRE предложения (в основном негативные прогнозные). Это может значительно ускорить работу.

Регулярное выражение я рекомендую:

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

По существу, отрицательный взгляд вперед гарантирует, что всякий раз, когда < присутствует (а именно в начале тега), это не закрытие </VisibleObject>.

. необходим, чтобы двигатель мог отменить один символ, когда отрицательный внешний вид видит закрывающий тег.

Вам необходимо будет использовать замену <VisibleObject></VisibleObject>.

Смежные вопросы