Minor thing, other range are too not very verbose with asserts + the upper two won't ever trigger in user code excpet if it extracts type with typeof(namedCaptures).
Yup and to be true DbC fellow add asserts to in{ ... }  contracts.

Thinking a bit about name - maybe make it namedGroups since it didn't capture anything yet as in match ;)