Как сопоставить все начальные теги в XML-документе с помощью RegEx? Мне просто нужно собрать используемые имена тегов.
Вот что у меня есть:
(?<=<)(.*?)((?= \/>)|(?=>))
Это соответствует всем начальным и закрывающим тегам.
Примере:
<Habazutty>yaddayadda</Habazutty>
<Vogons />
<Targ>blahblah</Targ>
Приведенный выше код соответствует:
Habazutty
/Habazutty
Vogons
Targ
/Targ
Мне нужно только
Habazutty
Vogons
Targ
Я не мог придумать способ исключить закрывающие теги. Отрицательный просмотр вперед не сработал - ничего не нашел. Я, должно быть, напортачил.
3 ответа
Вы можете изменить (?<=<)(.*?)((?= \/>)|(?=>))
на (?<=<)([^\/]*?)((?= \/>)|(?=>))
, т.е. вместо использования (.*?)
в качестве имени тега используйте ([^\/]*?)
. В любом случае /
нельзя использовать в именах тегов.
Вы можете добиться этого, просто используя:
<([^\/>]+)[/]*>
У группового захвата будет ваш результат
Нашел другое решение:
((?=<)(?!<\/)<)(.*?)((?= \/>)|(?=>))
По сути, этот ((?=<)(?!<\/)<)
просматривает все, что есть "<" (?=<)
, а не "" (?!<\/)
.
Ответ @ Redneb чище, меньше групп захвата, короче и интереснее.
Похожие вопросы
Связанные вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.