Как указано в комментариях, скорее всего, вам следует использовать XML синтаксический анализатор, а не регулярное выражение, но, поскольку формат RSS-канала, вероятно, согласован и довольно прост, решение для регулярных выражений тоже может работать.
Для текущий пример, который вы можете использовать:
<(.+)>\s*(?:<!\[CDATA\[)?\s*(.*)\s*(?:]]>)?\s*<\/\1>
Объяснение:
<(.+)>
- соответствует открывающему тегу, захватывает имя \s*
- соответствует необязательно пробельные символы (новая строка в вашем примере) (?:<!\[CDATA\[)?
- группа без захвата для <![CDATA[
, соответствует 0 или 1 раз \s*
- соответствует необязательным пробельным символам (.*)
- группа захвата, которая будет перехватывать любые символы \s*
- соответствует необязательным пробельным символам (?:]]>)?
- группа без захвата для ]]>
(закрытие CDATA) , соответствует 0 или 1 раз \s*
- сопоставляет необязательные пробельные символы <\/\1>
- сопоставляет закрывающий тег с тем же именем, что и открывающий тег (обратная ссылка на 1-ю группу захвата)
let input = `<title>
Coronavirus: Why the Covid-19 economic stimulus deal will make it to Trump's desk
</title>
<link>
https://www.independent.co.uk/news/world/americas/us-politics/coronavirus-economic-stimulus-deal-covid-19-trump-bill-senate-house-a9419976.html
</link>
<description>
<![CDATA[
News Analysis: When Senate tries to pass major bills, there's always one day of chaos. Monday appears to be that day.
]]>
</description>`;
let regex = /<(.+)>\s*(?:<!\[CDATA\[)?\s*(.*)\s*(?:]]>)?\s*<\/\1>/g;
let result;
do {
result = regex.exec(input);
if (result) {
console.log(result[1] + ": " + result[2]);
}
} while (result);