Чтобы лучше понять, давайте применим три выражения плюс группу захвата и проанализируем каждое поведение.
() группа захвата - регулярное выражение внутри круглых скобок должно быть сопоставлено, и совпадение создает группу захвата
(?:) группа без захвата - регулярное выражение внутри круглых скобок должно совпадать, но не создает группу захвата
(?=) позитивный взгляд в будущее - утверждает, что регулярное выражение должно быть сопоставлено
(?!) отрицательный взгляд в будущее - утверждает, что невозможно сопоставить регулярное выражение
Подаем заявку 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 соответствует
Итак, в заключение, реальная разница между прогнозирующими и не захватывающими группами заключается в том, хотите ли вы просто проверить наличие или проверить и сохранить совпадение. Группы захвата дороги, поэтому используйте их с умом.