Регулярное выражение для поиска и исправления несоответствующих закрывающих тегов xml в notepad

#regex #xml #notepad

#регулярное выражение #xml #notepad

Вопрос:

Я пытаюсь упростить процесс исправления отсутствующих несогласованных verse тегов в XML-файле, который выглядит следующим образом:

     <verse number="21">words words words asdlkjf alsdf. </verse>
    <verse number="22">words words words arbitrary words. 
      <verse number="23">more arbitrary text.</verse>
      <verse number="23">other arbitrary words. </chapter>
  

Я хотел бы использовать регулярное выражение в notepad , чтобы найти конец строки, которая начинается с произвольного количества пробелов, <verse но не заканчивается </verse>

При совпадении конца строки я должен иметь возможность использовать notepad find / replace для добавления отсутствующего тега обратно.

Вот что у меня есть на данный момент, которое соответствует каждой строке (к сожалению, всей строке), которая начинается с пробелов и <verse

 ^(  <verse).*
  

Комментарии:

1. В заголовке вопроса < и > должны быть заменены на < и >

2. Вы хотите добавить отсутствующий тег end verse?

3. </chapter> Нужно ли поддерживать в последней строке?

4. @Bohemian Да, я хотел бы добавить недостающие закрывающие теги; @trincot Да, важно оставить существующие </chapter> теги.

Ответ №1:

Это может быть то, что вы ищете:

Найти: (^h <verse(?!.*verse>h*).*?)((</.*?>h*)*)$
Заменить: $1</verse>$2

Учитывая примерные данные, он произведет две замены с таким результатом:

     <verse number="21">words words words asdlkjf alsdf. </verse>
    <verse number="22">words words words arbitrary words. </verse>
      <verse number="23">more arbitrary text.</verse>
      <verse number="23">other arbitrary words. </verse></chapter>
  

Комментарии:

1. Чудесное решение для ссылки на соответствующие группы; к сожалению, не так просто понять, как решение от @Bohemian; Я принял его, хотя, поскольку он более гибкий, где неуместный закрывающий тег может быть чем-то иным, чем </chapter>

2. Пожалуйста. Действительно, синтаксис был немного загроможден, потому что я экранировал символы < и > , которые на самом деле не нужны (я обновил это сейчас). h Представляет пробелы, а также табуляции и неразрывные пробелы (любой пробел, который не является новой строкой, но остается «горизонтальным»).

Ответ №2:

Сопоставление конца строки невозможно, но вы можете сопоставить всю строку и вернуть ее обратно с отсутствующим конечным тегом:

 Find: ^ *<verse>(.(?!</verse>))*(</w*>)?$
Repl: $0</verse>$1
  

Комментарии:

1. К вашему сведению, @gdw изменил неуместный конечный тег, чтобы он соответствовал любому тегу, отличному от verse.