2014-01-22 3 views
0

У меня есть набор XML-тегов:Regex: Добавить текст внутри тегов XML, если не существует

<foo></foo> 

Если метки имеют слово «бар» внутри я ничего не делаю

<foo>dog bar cat</foo> -> <foo>dog bar cat</foo> 

Если теги не имеют слово «бар» внутри я добавить его в конец текста

<foo>dog cat</foo> -> <foo>dog cat bar</foo>\ 

«бар» потенциально может быть в любом месте между тегами. Как я могу выполнить эту замену с помощью регулярного выражения?

Я попытался вариации следующих, но он не работает:

(<foo>.*?)((?:bar)*)(.*?</foo>) replace with $1 bar$3 

Я получаю разочарование с этим и может использовать некоторую помощь.

+0

Я мог бы сделать это в две замены легче: первая, чтобы удалить слово «бар» изнутри тегов foo, затем другое, чтобы добавить слово «бар» в конец. Это не идеально, но он выполняет мою работу. Мне было интересно, есть ли одно выражение, которое может сделать все. – user1697999

ответ

0

шаблон для поиска:

<foo>((?:(?!bar|</foo>).)*)</foo> 

Замена строки:

<foo>$1 bar</foo> 

Если <foo> тег имеет другой вложенный <foo> тег внутри, только внутренняя пара касании.

Обратите внимание, что приведенный выше шаблон использует отрицательные смотреть вперед (?!pattern), который поддерживается PCRE (PHP), .NET, Java, JavaScript, подталкивание библиотеки (Notepad ++), Perl ...

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