docs: public static UriComponentsBuilder fromUriString(String uri) {
  		Assert.hasLength(uri, "'uri' must not be empty");
  		Matcher matcher = URI_PATTERN.matcher(uri);
  		if (matcher.matches()) {
  			UriComponentsBuilder builder = new UriComponentsBuilder();
  			String scheme = matcher.group(2);
  			String userInfo = matcher.group(5);
  			String host = matcher.group(6);
  			String port = matcher.group(8);
  			String path = matcher.group(9);
  			String query = matcher.group(11);
  			String fragment = matcher.group(13);
  			boolean opaque = false;
  			if (StringUtils.hasLength(scheme)) {
  				String rest = uri.substring(scheme.length());
  				if (!rest.startsWith(":/")) {
  					opaque = true;
  				}
  			}
  			builder.scheme(scheme);
  			if (opaque) {
  				String ssp = uri.substring(scheme.length()).substring(1);
  				if (StringUtils.hasLength(fragment)) {
  					ssp = ssp.substring(0, ssp.length() - (fragment.length() + 1));
  				}
  				builder.schemeSpecificPart(ssp);
  			}
  			else {
  				builder.userInfo(userInfo);
  				builder.host(host);
  				if (StringUtils.hasLength(port)) {
  					builder.port(port);
  				}
  				builder.path(path);
  				builder.query(query);
  			}
  			if (StringUtils.hasText(fragment)) {
  				builder.fragment(fragment);
  			}
  			return builder;
  		}
  		else {
  			throw new IllegalArgumentException("[" + uri + "] is not a valid URI");
  		}
  	}