anchor.diff:      for (final path in paths) {
         final regExpPattern = RegExp(path.pattern);
         if (regExpPattern.hasMatch(settings.name)) {
  -        final match = regExpPattern.firstMatch(settings.name);
  -        var groupNameToMatch = <String, String>{};
  -        for (final groupName in match.groupNames) {
  -          groupNameToMatch[groupName] = match.namedGroup(groupName);
  -        }
  +        final firstMatch = regExpPattern.firstMatch(settings.name);
  +        final match = (firstMatch.groupCount == 1) ? firstMatch.group(1) : null;
           if (kIsWeb) {
             return NoAnimationMaterialPageRoute<void>(
  -            builder: (context) => path.builder(context, groupNameToMatch),
  +            builder: (context) => path.builder(context, match),
               settings: settings,
             );
           }
           return MaterialPageRoute<void>(
  -          builder: (context) => path.builder(context, groupNameToMatch),
  +          builder: (context) => path.builder(context, match),
             settings: settings,
           );
         }
  
positive.code: import 'package:gallery/studies/shrine/app.dart';
  import 'package:gallery/studies/starter/app.dart';
  
  typedef PathWidgetBuilder = Widget Function(BuildContext, Map<String, String>);
  
  class Path {
    const Path(this.pattern, this.builder);
  
negative.code:   final String pattern;
  
    /// The builder for the associated pattern route. The first argument is the
    /// [BuildContext] and the second argument a RegEx match if that is included
    /// in the pattern.
    ///
    /// ```dart
    /// Path(
    ///   'r'^/demo/([\w-]+)$',
    ///   (context, matches) => Page(argument: match),
    /// )
    /// ```
    final PathWidgetBuilder builder;
  