private static String matchAndTransform(final String k, final String v,
                                            final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers) {
        for (Pair<Pattern,BiFunction<String,String,String>> matcherConverter : parameterMatchers) {
            final Pattern pattern = matcherConverter.getValue0();
            final Matcher matcher = pattern.matcher(v);
            if (matcher.find()) {
                final BiFunction<String,String,String> converter = matcherConverter.getValue1();
                // when there are no groups there is a direct match
                return converter.apply(k, matcher.groupCount() == 0 ? "" : matcher.group(1));
            }
        }

        // this should be a raw string if it didn't match anything - suppose it could be a syntax error in the
        // test too, but i guess the test would fail so perhaps ok to just assume it's raw string value that
        // didn't need a transform by default
        return v;
    }
Parses features to a {@code Map} structure of the test name as the key with a {@code List} of Gremlin strings
for the value.

@param featureDir The root directory where feature files can be found including subdirectories
@param parameterMatchers list of pattern/functions that will transform a parameter from its Gherkin form to
                         another format triggering that new formatted string to be inserted into the Gremlin
                         itself
gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReader.java