Использование регулярных выражений в Notepad++, как захватить предыдущую строку после сопоставления выражения

У меня есть файл с тысячами записей, таких как:

<Source foo="goo">
    <Name label="SomeLabel"/>
</Source>
<Target foo="bar">
    <Name label="SomeLabel"/>
</Target>

Единственное, что изменяется, это строка "SomeLabel". Я пытаюсь написать поисковое выражение в Notepad++, которое будет возвращать либо только строки SomeLabel, либо, по крайней мере, всю строку. Однако я хочу эту строку, только если она находится между тегами ; Я не хочу узлов . Я знаю, что мне нужно использовать lookbehind (или lookahead), но я просто не могу понять это, особенно с символами <> в соответствующей строке.

Спасибо!

2 ответа

<> На самом деле не проблема. В соответствии с этими ограничениями, вы можете легко получить только нужный тег

[^"]+(?="\/>[^<]*<\/Target)

Вы можете использовать следующее выражение

<Target[^>]*>             # match <Target...>
(?:(?!</Target>)[\s\S])*? # match anything afterwards, 
                          # make sure not to overrun </Target>
label="SomeLabel"         # match label="SomeLabel"
(?:(?!</Target>)[\s\S])*? # same as above
</Target>                 # closing Tag

Здесь только записи с label="SomeLabel" выберите подробный режим и посмотрите демонстрацию на regex101.com.

Другие вопросы по тегам