Как получить значение тега с помощью регулярного выражения
У меня есть xml вида
<ex:student>
<ex:address>Германия
</ex:address>
</ex:student>
<university>
<address>Россия</address>
<strudent_address>Россия</strudent_address>
</university>
Я пытаюсь получить значение тегов address. Я написала регулярку, и хотя она отдает корректный результат, я не уверена, что она оптимальна и корректна
Регулярка: /<(|.*?:)address>(\s*.*?\s*)<[\/].*?address>/ig
Верно ли я написала регулярку?
Ответы (1 шт):
Автор решения: vsemozhebuty
→ Ссылка
Лучше, конечно, парсить XML сообразными средствами, потому что регулярки плохо подходят для разбора XML и HTML. Но если нет другого выхода, вашу можно немного улучшить:
(|.*?:)— чем использовать альтернативу с пустой строкой, можно весь фрагмент сделать опциональным.(\s*.*?\s*)— возможно, будет проще использовать флагs, если ваш язык его поддерживает.[\/]— использовать класс для одного символа вроде бы избыточно..*?address— слишком широко, может остановится на вложенном теге, гдеaddressлишь часть имени. Можем заменить обратной ссылкой на пространство имён открывающего тега (если его не было, в ссылке будет пустая строка).
У меня получился такой вариант на JS:
const xml = `
<ex:student>
<ex:address>Германия
</ex:address>
</ex:student>
<university>
<address>Россия</address>
<strudent_address>Россия</strudent_address>
</university>`;
const re = /<(.+?:)?address>(.*?)<\/\1address>/igs;
const addresses = xml.match(re);
console.log(addresses);