Как сопоставить все начальные теги в XML-документе с помощью RegEx? Мне просто нужно собрать используемые имена тегов.

Вот что у меня есть:

(?<=<)(.*?)((?= \/>)|(?=>))

Это соответствует всем начальным и закрывающим тегам.

Примере:

<Habazutty>yaddayadda</Habazutty>
<Vogons />
<Targ>blahblah</Targ>

Приведенный выше код соответствует:

Habazutty
/Habazutty
Vogons
Targ
/Targ

Мне нужно только

Habazutty
Vogons
Targ

Я не мог придумать способ исключить закрывающие теги. Отрицательный просмотр вперед не сработал - ничего не нашел. Я, должно быть, напортачил.

2
vacip 5 Сен 2016 в 14:27

3 ответа

Лучший ответ

Вы можете изменить (?<=<)(.*?)((?= \/>)|(?=>)) на (?<=<)([^\/]*?)((?= \/>)|(?=>)), т.е. вместо использования (.*?) в качестве имени тега используйте ([^\/]*?). В любом случае / нельзя использовать в именах тегов.

0
redneb 5 Сен 2016 в 11:33

Вы можете добиться этого, просто используя:

<([^\/>]+)[/]*>

У группового захвата будет ваш результат

2
Roger Barreto 27 Ноя 2017 в 13:12

Нашел другое решение:

((?=<)(?!<\/)<)(.*?)((?= \/>)|(?=>))

По сути, этот ((?=<)(?!<\/)<) просматривает все, что есть "<" (?=<), а не "(?!<\/).

Ответ @ Redneb чище, меньше групп захвата, короче и интереснее.

0
vacip 5 Сен 2016 в 11:38