Как получить значение тега с помощью регулярного выражения

У меня есть 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. Но если нет другого выхода, вашу можно немного улучшить:

  1. (|.*?:) — чем использовать альтернативу с пустой строкой, можно весь фрагмент сделать опциональным.
  2. (\s*.*?\s*) — возможно, будет проще использовать флаг s, если ваш язык его поддерживает.
  3. [\/] — использовать класс для одного символа вроде бы избыточно.
  4. .*?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);

→ Ссылка