code: @Trivial
      public static String getSymbol(String s) {
          String outputSymbol = null;
          if (s != null) {
              if (s.length() > 3) {
                  // ${} .. look for $
                  int pos = s.indexOf('$');
                  if (pos >= 0) {
                      // look for { after $
                      int pos2 = pos + 1;
                      if (s.length() > pos2) {
                          if (s.charAt(pos2) == '{') {
                              // look for } after {
                              pos2 = s.indexOf('}', pos2);
                              if (pos2 >= 0) {
                                  outputSymbol = s.substring(pos, pos2 + 1);
                              }
                          }
                      }
                  }
              }
          }
          return outputSymbol;
      }
docs: Answer the first symbolic substitution within a path.
  
  See {@link #containsSymbol(String)} for a description of a symbolic substitution.
  
  Answer null if the path is null or if the path contains no symbolic substitution.
  
  For example, for "leading/trailing" answer null.
  
  For example, for "leading/\$\{A\}"/trailing" answer "\$\{A\}".
  
  For example, for "leading/\$\{A\}"/inner/\$\{B\}/trailing" answer "\$\{A\}".
  
  Paths with badly formed substitutions answer unpredictable values. For example,
  for "leading\$\{A/inner/\$\{B\}/trailing" answer "\$\{A/inner/\$\{B\}".
  
  @param path The path from which to obtain the first symbol.
  
  @return The first symbol of the path. Null if the path is null or contains
  no symbolic substitutions.