Obtener subcadena de cadena en Java

1. Información general

En este tutorial rápido, nos centraremos en la funcionalidad de subcadena de Strings en Java.

Usaremos principalmente los métodos de la clase String y pocos de la clase StringUtils de Apache Commons .

En todos los siguientes ejemplos, usaremos esta cadena simple:

String text = "Julia Evans was born on 25-09-1984. " + "She is currently living in the USA (United States of America).";

2. Conceptos básicos de subcadena

Comencemos con un ejemplo muy simple aquí: extraer una subcadena con el índice de inicio:

assertEquals("USA (United States of America).", text.substring(67));

Observe cómo extrajimos el país de residencia de Julia en nuestro ejemplo aquí.

También hay una opción para especificar un índice final , pero sin él, la subcadena irá hasta el final de la Cadena.

Hagamos eso y eliminemos ese punto extra al final, en el ejemplo anterior:

assertEquals("USA (United States of America)", text.substring(67, text.length() - 1));

En los ejemplos anteriores, usamos la posición exacta para extraer la subcadena.

2.1. Obtener una subcadena que comience en un carácter específico

En caso de que la posición deba calcularse dinámicamente en función de un carácter o String , podemos hacer uso del método indexOf :

assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));

Un método similar que puede ayudarnos a localizar nuestra subcadena es lastIndexOf . El uso de Let lastIndexOf para extraer el año “1984”. Es la porción de texto entre el último guión y el primer punto:

assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));

Tanto indexOf como lastIndexOf pueden tomar un carácter o una cadena como parámetro. Extraigamos el texto “USA” y el resto del texto entre paréntesis:

assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));

3. Usando subSequence

La clase String proporciona otro método llamado subSequence que actúa de manera similar al método de subcadena .

La única diferencia es que devuelve CharSequence en lugar de String y solo se puede usar con un índice de inicio y fin específico:

assertEquals("USA (United States of America)", text.subSequence(67, text.length() - 1));

4. Usar expresiones regulares

Las expresiones regulares vendrán a nuestro rescate si tenemos que extraer una subcadena que coincida con un patrón específico.

En el ejemplo String, la fecha de nacimiento de Julia tiene el formato "dd-mm-aaaa". Podemos hacer coincidir este patrón utilizando la API de expresión regular de Java.

Primero que nada, necesitamos crear un patrón para "dd-mm-aaaa":

Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");

Luego, aplicaremos el patrón para encontrar una coincidencia del texto dado:

Matcher matcher = pattern.matcher(text);

Tras una coincidencia exitosa, podemos extraer la cadena coincidente :

if (matcher.find()) { Assert.assertEquals("25-09-1984", matcher.group()); }

Para obtener más detalles sobre las expresiones regulares de Java, consulte este tutorial.

5. Usando split

Podemos usar el método split de la clase String para extraer una subcadena. Digamos que queremos extraer la primera oración del ejemplo String. Esto es bastante fácil de hacer usando split :

String[] sentences = text.split("\\.");

Dado que el método split acepta una expresión regular, tuvimos que escapar del carácter de punto. Ahora el resultado es una matriz de 2 oraciones.

Podemos usar la primera oración (o iterar a través de toda la matriz):

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Tenga en cuenta que existen mejores formas de detección y tokenización de oraciones mediante Apache OpenNLP. Consulte este tutorial para obtener más información sobre la API de OpenNLP.

6. Usando el escáner

Generalmente usamos Scanner para analizar tipos primitivos y cadenas usando expresiones regulares. Un escáner divide su entrada en tokens usando un patrón delimitador , que por defecto coincide con los espacios en blanco.

Averigüemos cómo usar esto para obtener la primera oración del texto de ejemplo:

try (Scanner scanner = new Scanner(text)) { scanner.useDelimiter("\\."); assertEquals("Julia Evans was born on 25-09-1984", scanner.next()); }

En el ejemplo anterior, hemos establecido el ejemplo String como fuente para que lo use el escáner.

Luego, establecemos el carácter de punto como delimitador (que debe escaparse, de lo contrario, se tratará como el carácter de expresión regular especial en este contexto).

Finalmente, afirmamos el primer token de esta salida delimitada.

Si es necesario, podemos recorrer la colección completa de fichas utilizando un tiempo de bucle.

while (scanner.hasNext()) { // do something with the tokens returned by scanner.next() }

7. Dependencias de Maven

Podemos ir un poco más allá y usar una utilidad útil, la clase StringUtils , que forma parte de la biblioteca Apache Commons Lang:

 org.apache.commons commons-lang3 3.8 

Puede encontrar la última versión de esta biblioteca aquí.

8. Usando StringUtils

The Apache Commons libraries add some useful methods for manipulating core Java types. Apache Commons Lang provides a host of helper utilities for the java.lang API, most notably String manipulation methods.

In this example, we're going to see how to extract a substring nested between two Strings:

assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")"));

There is a simplified version of this method in case the substring is nested in between two instances of the same String:

substringBetween(String str, String tag)

The substringAfter method from the same class gets the substring after the first occurrence of a separator.

The separator isn't returned:

assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in "));

Similarly, the substringBefore method gets the substring before the first occurrence of a separator.

The separator isn't returned:

assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born"));

Puede consultar este tutorial para obtener más información sobre el procesamiento de cadenas utilizando Apache Commons Lang API.

9. Conclusión

En este artículo rápido, descubrimos varias formas de extraer una subcadena de una cadena en Java. Puede explorar nuestros otros tutoriales sobre manipulación de cadenas en Java.

Como siempre, los fragmentos de código se pueden encontrar en GitHub.