Regex для поиска подэлемента в XML - PullRequest
0 голосов
/ 13 июня 2019

Я использую функцию поиска по регулярным выражениям в Notepad ++ для поиска совпадений в нескольких сотнях файлов.

Моя цель - найти в каждом комбо-код родитель / потомок.Меня не волнует, что конкретно выбрано (родитель и ребенок или просто ребенок).Я просто хочу знать, содержит ли родитель определенный дочерний элемент.

Я хочу найти родительский элемент, который также имеет дочерний элемент.

Пример того, что он должен найти (поскольку один из подэлементов a):

<description>
    <otherstuff>
    </otherstuff>
    <something>
    </something>
    <description>
    </description>
    <otherstuff>
    </otherstuff>
</description>

Пример того, что он НЕ должен найти:

<description>
    <otherstuff>
    </otherstuff>
    <something>
    </something>
    <notadescription>
    </notadescription>
    <otherstuff>
    </otherstuff>
<description>

У каждого могут быть и другие дети, а также дети.Они оба также могут находиться в одном и том же документе.

Если я ищу это:

<description>(.*)<description>(.*)</description>

Он выбирает слишком много, потому что выберет другой верхний уровень, когда я только хочу его выбратьребенок для этого 2-го куска.

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

Вы сказали, что работаете с Notepad ++, вот способ:

  • Ctrl + F
  • Найти что: <description>(?:(?!</description).)*<description>(?:(?!<description>).)*</description>
  • check Match case
  • check Wrap вокруг
  • check Регулярное выражение
  • ПРОВЕРКА . matches newline

Пояснение:

<description>               # opening tag
(?:(?!</description).)*     # tempered greedy token, make sure we have not closing tag before:
<description>               # opening tag
(?:(?!<description>).)*     # tempered greedy token, make sure we have not opening tag before:
</description>              # closing tag

Снимок экрана:

enter image description here

0 голосов
/ 13 июня 2019

Я предполагаю, что мы разработали бы выражение для исключения <notadescription>, например:

<description>(?!<notadescription>)[\s\S]*<\/description>

, которое, если мы собираем элемент описания, нам может потребоваться группа захвата:

(<description>(?!<notadescription>)[\s\S]*<\/description>)

Демо

0 голосов
/ 13 июня 2019

Вы не должны использовать (.*) это жадный Вот пример, почему вы не должны использовать его в вашем случае

<description>
    <otherstuff>
    </otherstuff>
    <description>
        <description>hello<\description>
    </description>
<\description>

Предположим, что здесь мы используем <description>(.*)<description>(.*)</description> Это будет разбирать:

    <description>
        <description>hello<\description>
    </description>
<\description>

Так что, если вы хотите разобрать только то, что находится во втором описании, вы должны использовать (.*?), это называется не жадным Использование <description>(.*)<description>(.*?)</description> будет анализировать:

<description>
    <description>hello<\description> # end of parse
# here <\description> is missing cause (.*?) will look only for the first match

Таким образом, вы должны использовать (.*?), он прекратит синтаксический анализ сразу же, когда найдет первое совпадение конца, но (.*) будет жадным, поэтому будет искать максимально возможное совпадение

Так что, если вы используете <description>(.*)<description>(.*?)</description>, все будет в порядке, потому что он будет анализировать только то, что находится внутри описания в вашем случае

...