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