@VisibleForTesting
    static <T, U> RoutingPredicate<T> of(String predicateExpr,
                                         Function<String, U> nameConverter,
                                         Function<U, Predicate<T>> containsPredicate,
                                         BiFunction<U, String, Predicate<T>> equalsPredicate) {
        final RoutingPredicate<T> routingPredicate = parseRoutingPredicate(predicateExpr,
                                                                           nameConverter,
                                                                           containsPredicate,
                                                                           equalsPredicate);

        checkArgument(routingPredicate != null,
                      "Invalid predicate: %s (expected: " +
                      "name, !name, name=value, name!=value or any of them concatenated by '||')",
                      predicateExpr);

        return new RoutingPredicate<>(routingPredicate.name, routingPredicate.delegate, false);
    }
Patterns used to parse a given predicate. The predicate can be one of the following forms:
<ul>
    <li>{@code some-name=some-value} which means that the request must have a
    {@code some-name=some-value} header or parameter</li>
    <li>{@code some-name!=some-value} which means that the request must not have a
    {@code some-name=some-value} header or parameter</li>
    <li>{@code some-name} which means that the request must contain a {@code some-name} header or
    parameter</li>
    <li>{@code !some-name} which means that the request must not contain a {@code some-name} header or
    parameter</li>
    <li>{@code some-name=some-value || some-other-value} which means that the request must have
    a {@code some-name=some-value} or a {@code some-other-value} header or parameter</li>
</ul>
core/src/main/java/com/linecorp/armeria/server/RoutingPredicate.java