class PathMatchers {

  private PathMatchers() {}

  /**
   * Gets a {@link PathMatcher} for the given syntax and pattern as specified by {@link
   * FileSystem#getPathMatcher}. The {@code separators} string contains the path name element
   * separators (one character each) recognized by the file system. For a glob-syntax path matcher,
   * any of the given separators will be recognized as a separator in the pattern, and any of them
   * will be matched as a separator when checking a path.
   */
  // TODO(cgdecker): Should I be just canonicalizing separators rather than matching any separator?
  // Perhaps so, assuming Path always canonicalizes its separators
  public static PathMatcher getPathMatcher(
      String syntaxAndPattern, String separators, ImmutableSet<PathNormalization> normalizations) {<FILL_FUNCTION_BODY>}

  private static PathMatcher fromRegex(String regex, Iterable<PathNormalization> normalizations) {
    return new RegexPathMatcher(PathNormalization.compilePattern(regex, normalizations));
  }

  /**
   * {@code PathMatcher} that matches the {@code toString()} form of a {@code Path} against a regex
   * {@code Pattern}.
   */
  @VisibleForTesting
  static final class RegexPathMatcher implements PathMatcher {

    private final Pattern pattern;

    private RegexPathMatcher(Pattern pattern) {
      this.pattern = checkNotNull(pattern);
    }

    @Override
    public boolean matches(Path path) {
      return pattern.matcher(path.toString()).matches();
    }

    @Override
    public String toString() {
      return MoreObjects.toStringHelper(this).addValue(pattern).toString();
    }
  }
}

    int syntaxSeparator = syntaxAndPattern.indexOf(':');
    checkArgument(
        syntaxSeparator > 0, "Must be of the form 'syntax:pattern': %s", syntaxAndPattern);

    String syntax = Ascii.toLowerCase(syntaxAndPattern.substring(0, syntaxSeparator));
    String pattern = syntaxAndPattern.substring(syntaxSeparator + 1);

    switch (syntax) {
      case "glob":
        pattern = GlobToRegex.toRegex(pattern, separators);
        // fall through
      case "regex":
        return fromRegex(pattern, normalizations);
      default:
        throw new UnsupportedOperationException("Invalid syntax: " + syntaxAndPattern);
    }
  
<no_super_class>