Чтобы лучше понять, давайте применим три выражения плюс группу захвата и проанализируем каждое поведение.
()
группа захвата - регулярное выражение внутри круглых скобок должно быть сопоставлено, и совпадение создает группу захвата
(?:)
группа без захвата - регулярное выражение внутри круглых скобок должно совпадать, но не создает группу захвата
(?=)
позитивный взгляд в будущее - утверждает, что регулярное выражение должно быть сопоставлено
(?!)
отрицательный взгляд в будущее - утверждает, что невозможно сопоставить регулярное выражение
Подаем заявку q(u)i
на выход . q
соответствует q, а группа захвата u
соответствует u . Будет выполнено совпадение внутри группы захвата, и группа захвата будет создана. Итак, двигатель продолжает работать i
. И i
будет соответствовать i . Эта последняя попытка совпадения успешна.qui сопоставляется, и создается группа захвата с u .
Подаем заявку q(?:u)i
на выход . Опять же, q
соответствует q, а группа без захвата u
соответствует u . Выбирается совпадение из группы без захвата, но группа захвата не создается. Итак, двигатель продолжает работать i
. И i
будет соответствовать я . Эта последняя попытка совпадения успешна. qui совпадает
Подаем заявку q(?=u)i
на выход . Предварительный просмотр положительный, за ним следует другой токен. Опять же, q
соответствует q и u
соответствует u . Опять же, совпадение из опережающего просмотра должно быть отброшено, поэтому движок отступает от i
строки к u . Предварительный просмотр был успешным, поэтому двигатель продолжает работу i
. Ноi
не может соответствовать тебе . Итак, эта попытка совпадения не удалась.
Подаем заявку q(?=u)u
на выход . Предварительный просмотр положительный, за ним следует другой токен. Опять же, q
соответствует q и u
соответствует u . Совпадение из опережающего просмотра должно быть отброшено, поэтому движок отступает от u
строки к u . Предварительный просмотр был успешным, поэтому двигатель продолжает работу u
. И u
будет соответствовать U . Итак, эта попытка совпадения успешна.qu соответствует
Подаем заявку q(?!i)u
на выход . Даже в этом случае просмотр вперед положительный (потому i
что не совпадает), и за ним следует другой токен. Опять же, q
соответствует q и i
не соответствует u . Совпадение из опережающего просмотра должно быть отброшено, поэтому движок отступает от u
строки к u . Предварительный просмотр был успешным, поэтому двигатель продолжает работу u
. И u
будет соответствовать U . Итак, эта попытка совпадения успешна.qu соответствует
Итак, в заключение, реальная разница между прогнозирующими и не захватывающими группами заключается в том, хотите ли вы просто проверить наличие или проверить и сохранить совпадение. Группы захвата дороги, поэтому используйте их с умом.