Строка поиска регулярного выражения Perl для этой задачи может быть, например:
(?s)^[\t ]*<XmlElement2(?:.(?!</XmlElement2>))+?SearchTerm.+?</XmlElement2>[\t ]*(?:\r?\n|\r)
Пояснение:
(?s)
... признак совпадения символов новой строки и точки в поисковом выражении.
^[\t ]*
... начать поиск в начале строки и найти 0 или более символов табуляции или пробелов.
<XmlElement2
... начальный тег удаляемого элемента, содержащий SearchTerm
.
(?:.(?!</XmlElement2>))+?
... группа без пометок, чтобы найти любой символ, один или несколько раз не жадный, если строка после текущего символа не равна </XmlElement2>
. Отрицательный прогноз (?!</XmlElement2>)
не позволяет выбрать блок, начинающийся с <XmlElement2
и сопоставляющий все, включая один или несколько тегов </XmlElement2>
и <XmlElement2
, до тех пор, пока SearchTerm
не будет найден где-либо в файле.
SearchTerm
... строка, которая должна быть найдена внутри элемента XmlElement2
.
.+?
... любой символ (включая символы новой строки) один или несколько раз не жадный. «Нежадный» означает здесь, чтобы остановить сопоставление символов при следующем появлении </XmlElement2>
, а не при последнем появлении </XmlElement2>
в файле.
</XmlElement2>
... конечный тег элемента XML, который нужно удалить, содержащий SearchTerm
.
[\t ]*(?:\r?\n|\r)
... 0 или более символов табуляции или пробелов и DOS / Windows (возврат каретки + перевод строки) или UNIX (только перевод строки) или MAC (просто возврат каретки).
PS: Замена регулярного выражения Perl была протестирована с UltraEdit для Windows v22.20.0.49 в Windows XP и v25.20.0.88 в Windows 7, поскольку у меня нет Mac.