Как сопоставить несколько вхождений подстроки

Если у меня есть строка HTML, например:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div>

И я хочу текст:

20<span class="abc" /><span class="def">56

Как определить регулярное выражение для соответствия разделам цели несколько раз. До сих пор я:

str.match(/\d*<[^>]*>\d*/)

Но это вернет только первый номер раздела 20<span class="abc" />

Мне нужно, чтобы это было гибким, чтобы сопоставлять несколько разделов тегов/чисел при обрезке чего-либо, ведущего или завершающего первую/последнюю цифру в строке.

Ответ 1

Чтобы совпадать несколько раз, используйте по необходимости глобальную опцию

str.match(/your_expression_here/g)
                                ^

Ответ 2

Добавление /g недостаточно, если вы хотите сопоставить несколько вхождений подстроки. В этом случае квантификаторы с неохотным регистром могут быть использованы, как описано здесь.

Учитывая строку:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div>

Вы получите текст, который вы хотели использовать:

\d+.*>\d+

Но с учетом того, что одна и та же строка повторяется два раза:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div><div><p>£20<span class="abc" /><span class="def">56</span></p></div>

Вы не найдете целевой выбор несколько раз. Вы найдете его только один раз из-за жадного характера .*. Чтобы сделать .* нежадным или неохотным, просто добавьте ? после *, и вы получите:

\d+.*?>\d+

Который найдет оба вхождения запрашиваемой подстроки как , показанное здесь.

Ответ 3

Просто позвольте группе повторять: (?:...)+ означает "Match ... 1 или более раз:

str.match(/\d+(?:<[^>]*>)+\d+/)

Согласно предложению Алана Мура, я также изменил \d* на \d+, сделав требуемые числа вместо необязательного.