Оператор +
жадный и отступает по мере необходимости. Предварительный просмотр (?=(\d+))
будет соответствовать 456, а затем 56, если регулярное выражение не выполнено, и 6, если регулярное выражение не выполнено. Первая попытка: 456. Это соответствует, группа 1 содержит 456. Тогда у нас есть \w+
, который является жадным и занимает 456x56, ничего не осталось, но мы все еще должны соответствовать \1
, то есть 456. Таким образом: ошибка. Затем \w+
возвращается на один шаг за раз, пока мы не доберемся до начала регулярного выражения. И все равно не получается.
Мы потребляем символ из строки. Следующая обратная попытка пытается найти совпадение с подстрокой 56. Она совпадает, и группа 1 содержит 56. \w+
совпадений до конца строки и получает 456x56, а затем мы пытаемся сопоставить 56: неудача. Так что \w+
бактраков, пока у нас не останется 56 в строке, и тогда мы получим глобальное совпадение и успех регулярного выражения.
Вы должны попробовать это в режиме отладки regex buddy.