public List<String> parse(String s) {
    if (s == null || s.length() < 1) {
      return new ArrayList<String>();
    }
    
    List<String> l = new ArrayList<String>(getLineLength());

    /*
      Sure wish I could do this in the regex...TODO for later excercise?
     */
    String matchString = s;
    if (s.startsWith(String.valueOf(getCharSep()))) {
      l.add("");
      matchString = s.substring(1);
    }


    csvMatcher.reset(matchString);
    while (csvMatcher.find()) {
      String field = null;
      String first = csvMatcher.group(2); //2
      
      if (first != null) {
        field = first;
      } else {
        dqMatcher.reset(csvMatcher.group(1)); //1
        field = dqMatcher.replaceAll("\"");
      }
      
      l.add(field);
    }
    
    if (getEnforceColumns() > 0) {
      if (l.size() !=  getEnforceColumns()) {
        throw new NumberOfColumnsException("Number of columns expected was "
                                           + String.valueOf(getEnforceColumns())
                                           + " but parsed " + String.valueOf(l.size()),
                                           getEnforceColumns(), l.size());
      }
    }
    
    
    return l;
  }