Вы не можете вставить HTML в строку для отображения в React, это существует как защита от XSS.
То, что вы можете сделать в таком случае, выглядит примерно так:
const str = 'foo123bar';
const coloredStr = str.match(/\d+/);
const [before, after] = str.split(/\d+/)
return (
<div className="App">
{before}
{coloredStr && coloredStr[0] &&
<span style="color: red">{coloredStr[0]}</span>
}
{after}
</div>
);
Для более сложного примера вам понадобится более сложная логика.Например, несколько частей могут быть стилизованы - вы можете найти все совпадения и несоответствующие части и поместить их в список в правильном порядке с индикатором, если вы используете диапазон или нет.Примерно так:
list.map((elem) => elem.isColored ? <span style="color: red">{elem.value}</span> : elem.value)
РЕДАКТИРОВАТЬ
Как уже упоминалось в комментариях, здесь есть реализация для нескольких элементов:
const str = 'foo123bar456baz897ban';
let strCopy = str;
const list = [];
while(strCopy) {
const text = strCopy.split(/\d+/, 1)[0];
list.push(text);
const match = strCopy.match(/\d+/);
if (!match) {
break;
}
list.push(match[0]);
strCopy = strCopy.substring(match.index + match[0].length);
}
return (
<div className="App">
{list.map((elem, index) => index % 2 === 0
? elem
: <span style="color: red">{elem}</span>
)}
</div>
);