private List<String> TrocearExpresion(String expresion) {
    expresion = eliminarParentesisRedundantesExternos(expresion);
    Map<TipoOperacionCriterioEmun, List<Integer>> posicionOperacionessExternas =
        obtenerPosicionOperancionesExternas(expresion);
    Map<TipoOperacionCriterioEmun, Integer> mapaOperacion =
        obtenerOperacionExterna(posicionOperacionessExternas);

    if (mapaOperacion.isEmpty() || mapaOperacion.size() != 1) return null;

    List<String> result = new ArrayList<String>();

    for (TipoOperacionCriterioEmun tipoOperacionEmun : mapaOperacion.keySet()) {
      result.add(0, tipoOperacionEmun.getRepresentacion());

      if (tipoOperacionEmun.equals(TipoOperacionCriterioEmun.NOT)) {
        result.add(
            1,
            expresion.substring(
                mapaOperacion.get(tipoOperacionEmun)
                    + tipoOperacionEmun.getRepresentacion().length()
                    + 1,
                expresion.length() - 1));
        return result;
      }
      result.add(1, expresion.substring(0, mapaOperacion.get(tipoOperacionEmun)));
      result.add(
          2,
          expresion.substring(
              mapaOperacion.get(tipoOperacionEmun) + tipoOperacionEmun.getRepresentacion().length(),
              expresion.length()));
    }

    return result;
  }
  private Map<TipoOperacionCriterioEmun, List<Integer>> obtenerPosicionOperancionesExternas(
      String expresion) {
    Map<TipoOperacionCriterioEmun, List<Integer>> result =
        new HashMap<TipoOperacionCriterioEmun, List<Integer>>();
    Map<Integer, Integer> mapaParentesis = obtenerPosicionesParentesisExternos(expresion);

    Integer lastPosicionView = 0;
    for (TipoOperacionCriterioEmun tipoOperacionEmun :
        TipoOperacionCriterioEmun.getListaValoresEvaluacion()) {
      lastPosicionView = 0;
      List<Integer> listaPosicines = new ArrayList<Integer>();

      if (tipoOperacionEmun.equals(TipoOperacionCriterioEmun.NOT)) {
        if ((lastPosicionView =
                expresion.indexOf(tipoOperacionEmun.getRepresentacion() + "(", lastPosicionView))
            != -1) {
          if (!estaEntreParentesis(mapaParentesis, lastPosicionView)
              && mapaParentesis.get(
                      lastPosicionView + TipoOperacionCriterioEmun.NOT.getRepresentacion().length())
                  == expresion.length() - 1) {
            listaPosicines.add(lastPosicionView);
            result.put(tipoOperacionEmun, listaPosicines);
            return result;
          }
        }
        result.put(tipoOperacionEmun, listaPosicines);
        continue;
      }

      while ((lastPosicionView =
              expresion.indexOf(tipoOperacionEmun.getRepresentacion(), lastPosicionView))
          != -1) {
        if (!estaEntreParentesis(mapaParentesis, lastPosicionView)
            && operacionInequivoca(
                tipoOperacionEmun, expresion.substring(lastPosicionView - 1, lastPosicionView + 2)))
          listaPosicines.add(lastPosicionView);
        lastPosicionView++;
      }
      result.put(tipoOperacionEmun, listaPosicines);
    }

    return result;
  }