Separar partes de una cadena con distintos separadores en Java

En alguna ocasión, se nos puede presentar una cadena de texto que deseamos tratar palabra por palabra. Suele ser algo habitual cuando hablamos de tratamiento de cadenas de textos o de Strings en cualquier lenguaje de programación.

Hace años, era típico usar la clase llamada StringTokenizer para estos cometidos, pero ya quedó obsoleta o deprecated, como se suele decir.

En la actualidad, se suele utilizar el método split() incluido en la clase String. Se le puede pasar como parámetro el separador devuelve un Array con cada una de las partes.

Pero podemos encontrarnos casos más difíciles. Por ejemplo, cuando nos encontramos más de un separador distinto. O cuando queremos parsear una cadena para separar primero las palabras que vienen entre comillas para mantenerlas en el mismo grupo, y después separar por espacios el resto, de manera similar a cómo lo haría un buscador.

Lo primero que se suele venir a la cabeza, sería mediante 2 bucles o pasadas: la primera para separar los grupos entrecomillados y la segunda para las cadenas en Java separadas por espacios.

Sin embargo, Java nos ofrece una manera más sencilla y más limpia: utilizando la clase Scanner.

public static List<String> splitString(String input) {

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

    Scanner scanner = new Scanner(input);

    scanner.useDelimiter("\"|\\s");

    while(scanner.hasNext() ) {

        String next = scanner.next();

        if(!next.isEmpty()) {

            result.add(next);

        }

    }

    scanner.close();

    return result;

}

Esta función, recibe como parámetro la cadena a tratar y devuelve un List con las cadenas separadas. Para ello utiliza la clase Scanner, con el delimitador «\»|\\s», es decir, separa las cadenas delimitadas por comillas (\») y las delimitadas por espacios (\\s). Con cualquiera de los dos delimitadores.

Por último, va recorriendo el resultado de aplicar el Scanner y lo va metiendo en una ArrayList para devolverlo, no sin antes cerrar el Scanner con el método close().

Si lo que se desea es que primero separe las cadenas entrecomilladas y, del resto, las separe por espacios, se debería utilizar esta función.

private static List<String> splitString(String input) {

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


    final String regex = "\\s(\"[^\"]*\"|[^\\s]*)";

    final Pattern pattern = Pattern.compile(regex);

    // le agregamos un espacio al texto para que coincida con el primer elemento

    final Matcher matcher = pattern.matcher(" " + input);

    while (matcher.find()) {

        result.add(matcher.group(1).replace("\"", ""));
  

    }

    return result;

}

Deja un comentario

Pin It on Pinterest