code: public static List<String> split(String pArg, String pEscape, String pDelimiter) {
          if (pArg != null) {
              ArrayList<String> ret = new ArrayList<String>();
              Pattern[] pattern = SPLIT_PATTERNS.get(pEscape + pDelimiter);
              if (pattern == null) {
                  pattern = createSplitPatterns(pEscape, pDelimiter);
                  SPLIT_PATTERNS.put(pEscape + pDelimiter,pattern);
              }
  
              final Matcher m = pattern[0].matcher(pArg);
              while (m.find() && m.start(1) != pArg.length()) {
                  // Finally unescape all escaped parts. Trailing escapes are captured before the delimiter applies
                  String trailingEscapes = m.group(2);
                  ret.add(pattern[1].matcher(m.group(1) + (trailingEscapes != null ? trailingEscapes : "")).replaceAll("$1"));
              }
              return ret;
          } else {
              return null;
          }
      }
docs: Split a string on a delimiter, respecting escaping with an escape char. Assuming
  that a backslash (<code>\</code>) is used as escape char, then the following
  replacement rules apply:
  
  <ul>
  <li>
  <code>\</code><em>delimiter</em> for the delimiter as literal
  </li>
  <li>
  <code>\\</code> for backslashes
  </li>
  <li>
  <code>\</code><em>(everything else)</em> is the same as <em>(everything else)</em>.
  </li>
  
  @param pArg argument to split
  @param pEscape escape pattern as it can be used in a regular expression.
  @param pDelimiter delimiter to use
  @return the split string as list or an empty array if the argument was null