docs: public static <T extends ContentMeta> ResourceSelector<T> resourceSelector(String selector) {
          if (null == selector) {
              throw new NullPointerException();
          }
          if("*".equals(selector)) {
              return allResourceSelector();
          }
          String[] split = selector.split(";");
          Map<String, String> values = new HashMap<String, String>();
          Map<String, String> regexes = new HashMap<String, String>();
          for (int i = 0; i < split.length; i++) {
              String s = split[i].trim();
              String[] split1 = s.split("=", 2);
              if (split1.length == 2) {
                  String key = split1[0].trim();
                  String value = split1[1];
                  if (value.startsWith("~")) {
                      //regex
                      regexes.put(key, value.substring(1).trim());
                  } else {
                      values.put(key, value.trim());
                  }
              }
          }
          ResourceSelector<T> equalsSelector = null;
          ResourceSelector<T> regexSelector = null;
  
          if (values.size() > 0) {
              equalsSelector = PathUtil.exactMetadataResourceSelector(values, true);
          }
          if (regexes.size() > 0) {
              regexSelector = PathUtil.regexMetadataResourceSelector(regexes, true);
          }
          if (null == equalsSelector) {
              return regexSelector;
          }
          if (null == regexSelector) {
              return equalsSelector;
          }
          return PathUtil.composeSelector(equalsSelector, regexSelector, true);
      }