@devdb

Почему Non-greedy (нежадный) RegExp не работает?

Иногда сталкивался с тем, что регулярные выражения в JavaScript не работали как задумывалось. Списывал это на глючный RegExp в JavaScript. Но вот опять в JS столкнулся с тем, что non-greedy оператор не работает. Проверил в Python - и там тоже не работает. В чём объяснение?
Задача - получить числа из последней колонки в таблице с помощью Regexp. Сначала выдрать их из html, а потом уже отфильтровать от мусора. Но выдрать не получается из-за непонятной работы нежадного оператора (строка html и регулярка сильно упрощены для наглядности):
//JavaScript
s = '<tr><td>11</td><td>22</td></tr><tr><td>33</td><td>44</td></tr>';
s.match(/\d+.+?<\/tr/g);
// Array [ "11</td><td>22</td></tr", "33</td><td>44</td></tr" ]

#Python
s = '<tr><td>11</td><td>22</td></tr><tr><td>33</td><td>44</td></tr>'
import re
re.findall( r'\d+.+?<\/tr', s )
# ['11</td><td>22</td></tr', '33</td><td>44</td></tr']

Как видим, Regex захватывает лишние колонки таблицы вместо того, чтобы брать минимальную подстроку, удовлетворяющую условию.
Ожидался результат:
[ '22</td></tr', '44</td></tr' ]

Вопрос не в том, чтобы помочь решить задачу (я её и сам костылями решу), а в том, чтобы объяснить почему non-greedy оператор +? не срабатывает?
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
Seasle
@Seasle Куратор тега JavaScript
\( ゚ヮ゚)/
UPD:
Действительно, в первый раз не верно прочитал вопрос. Можете достать число вот таким способом:
const string = '<tr><td>11</td><td>22</td></tr><tr><td>33</td><td>44</td></tr>';
const match = string.match(/(\d+)(?=<\/td><\/tr>)/g); 
// или так: string.match(/(\d+)(?=[^\d]+?<\/tr>)/g)
// или так: string.match(/(\d+)(?=\D+?<\/tr>)/g)

console.log(match); // [ '22', '44' ]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы