Регулярки и позиционная проверка

 
 
 
Сообщения:6
Просьба не бить ногами за легкий оффтоп.
Есть строка "123456789". Есть вот такая регулярка
(?=(\d{3})+)

Данная регулярка ищет позиции, с которой начинаются совпадения хотя бы одной группы из трех цифр. То есть каждая позиция в этой строке, за исключением последних двух вызывает совпадение. Для проверки я делаю вставку запятых и получаю ",1,2,3,4,5,6,789". Тут все понятно как оно работает.

А теперь я добавлю в конец границу слова вот так
(?=(\d{3})+\b)

При вставке запятых получается ",123,456,789"
Вопрос: почему добавление границы слова так влияет на поиск, что теперь ищется группы по три символа подряд (теперь эти группы не пересекаются)?
Это кусок примера из Фридла, но объяснения почему оно так работает мне не понятно. Вот цитата оттуда
Quote:
Группа из трех цифр определяется выражением \d\d\d. Заключим ее в конструкцию (…)+, чтобы совпадение могло состоять из нескольких групп, и завершим метасимволом $, чтобы гарантировать отсутствие символов после совпадения.


https://regex101.com/r/05cZ3B/1/
 
 
Сообщения:176
Допустим, в строке "123456789" проверка начинается с цифры 2.
Тогда (?=(\d{3})+) будет соответствовать следующему 234 567. Цифры 89 просто будут проигнорированы.
Возьмём (?=(\d{3})+\b) Тут у нас уже соответствия нет, т.к. последние совпадающие цифры 567 не заканчиваются на границе слова.
 
 
Сообщения:6
Гениально! Спасибо! Понял.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет