Java: busque subcadena en la cadena

J

Introducción

Programar sustratos dentro de una cadena es una tarea bastante común. Por ejemplo, a veces queremos romper una cadena si hay una plantilla en un punto. Otras veces, queremos cambiar el flujo si hay (o no) una determinada subcadena String, que puede ser un comando.

Hay algunas formas de hacer esto en Java, y se espera que la mayoría de ellas aparezcan también en otros lenguajes de programación. Un enfoque que es exclusivo de Java, sin embargo, es el uso de un Pattern class, que cubriremos más adelante en el artículo.

O puede usar Apache Commons y la clase de ayuda StringUtils, que ofrece muchos métodos derivados de los métodos básicos para este propósito.

Núcleo de Java

String.contains ()

La forma más importante de comprobar la subcadena es .contains() método. Es proporcionado por el String propia clase y es muy eficaz.

El método asume un CharSequence y vuelve true si la secuencia está presente en el String, llamamos al método:

String string = "Java";
String substring = "va";

System.out.println(string.contains(substring));

Esto daría como resultado:

true

Nota: El es .contains() el método distingue entre mayúsculas y minúsculas. Si intentáramos buscar "Va" en nuestro string, el resultado sería false.

A menudo, para evitar esta pregunta, dado que no buscamos distinción entre mayúsculas y minúsculas, estaría de acuerdo con el caso de ambas cadenas antes de verificar:

System.out.println(string.toLowerCase().contains(substring.toLowerCase()));
// OR
System.out.println(string.toUpperCase().contains(substring.toUpperCase()));

String.indexOf ()

El es .indexOf() método un poco más tosco que el .contains() método, pero sin embargo es el mecanismo básico que permite la .contains() método para trabajar.

Lanza el índice por primera vez que se ha producido una subcadena dentro de una Cadena y ofrece algunos constructores para elegir:

indexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(String str)
indexOf(String str, int fromIndex)

Podemos buscar un solo carácter con o sin desplazamiento o Buscar cadena con o sin desplazamiento.

El método de índice devolverá el primer evento si está presente, y -1 si no:

String string = "Lorem ipsum dolor sit amet.";

// You can also use unicode for characters
System.out.println(string.indexOf('i'));
System.out.println(string.indexOf('i', 8));
System.out.println(string.indexOf("dolor"));
System.out.println(string.indexOf("Lorem", 10));

Como resultado de pasar este código:

6
19
12
-1
  • La primera aparición de i que esta en la palabra ipsum, 6 lugares desde el comienzo de la secuencia de caracteres.
  • La primera aparición de i para compensar de 8 (es decir, la búsqueda comienza en s Delaware ipsum) que está en el sit palabra, 19 lugares desde el principio.
  • La primera aparición de String dolor Hay 12 plazas desde el principio.
  • Y finalmente, no ocurre nada Lorem para compensar de 10.

En definitiva, el .contains() llamadas al método en el .indexOf() método para trabajar. Hace eso .indexOf() esencialmente más eficiente que su contraparte (aunque en una cantidad muy pequeña), aunque tiene un caso de uso ligeramente diferente.

String.lastIndexOf ()

A diferencia del .indexOf() método, que devuelve la primera aparición, el .lastIndexOf() el método devuelve el índice del último evento de un carácter o String, con o sin desplazamiento:

String string = "Lorem ipsum dolor sit amet.";

// You can also use unicode for characters
System.out.println(string.lastIndexOf('i'));
System.out.println(string.lastIndexOf('i', 8));
System.out.println(string.lastIndexOf("dolor"));
System.out.println(string.lastIndexOf("Lorem", 10));

Como resultado de pasar este código:

19
6
12
0

Los resultados pueden sorprender a algunos y decir:

lastIndexOf('i', 8) debería estar de vuelta 19 por lo que el último episodio del personaje después del octavo personaje de la cadena

Algo que vale la pena señalar es cuando el .lastIndexOf() método, la secuencia del carácter se invierte. El recuento comienza en el último carácter y avanza hacia el primero.

Dicho esto, sí. Se espera la salida 6, por lo que el último episodio del personaje después de omitir 8 elementos del final de la secuencia.

Patrón con Regex y Matcher

El es Pattern es esencialmente una ilustración compilada de un expresión regular. Se utiliza junto con Matcher clase para que coincida con las secuencias de caracteres.

Esta clase funciona armando primero un patrón. Luego asignamos otro patrón a un Matcher por ejemplo, que utiliza el .find() un método para comparar los patrones asignados y compilados.

Si coinciden, el .find() resultados del método true. Si los patrones no coinciden, el método da como resultado false.

Pattern pattern = Pattern.compile(".*" + "some" + ".*");

Matcher matcher = pattern.matcher("Here is some pattern!");
System.out.println(matcher.find());

Esto daría:

true

Apache Commons

Debido a su utilidad y prevalencia en Java, existen muchos proyectos Apache Commons incluido en la ruta de clases. Es una gran biblioteca con muchas características útiles que se utilizan a menudo en producción, y la comprobación de subcadenas no es una excepción.

Apache Commons proporciona StringUtils clase con muchos métodos auxiliares para manipulación de cadenas, comprobación de nulos, etc. Para realizar esta tarea, podemos hacer cualquiera de estos .contains(), .indexOf(), .lastIndexOf()o .containsIgnoreCase() métodos.

Si no es así, es muy fácil agregar dependencia a su pom.xml archivo si está utilizando Maven:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>{version}</version>
</dependency>

O agregándolo a través de Gradle:

compile group: 'org.apache.commons', name: 'commons-lang3', version: '{version}'

StringUtils.contains ()

El es .contains() el método es bastante simple y muy similar al enfoque básico de Java.

La única diferencia es que no llamamos al método String que estamos comprobando (porque no encuentra este método), sino que pasamos el String que estamos buscando junto al String que estamos buscando:

String string = "Checking for substrings within a String is a fairly common task in programming.";

System.out.println(StringUtils.contains(string, "common task"));

Como resultado de pasar este código:

true

Nota: Este método distingue entre mayúsculas y minúsculas.

StringUtils.indexOf ()

Por supuesto, el .indexOf() el método funciona de manera muy similar al enfoque básico de Java:

String string = "Checking for substrings within a String is a fairly common task in programming.";

// Search for first occurrence of 'f'
System.out.println(StringUtils.indexOf(string, 'f'));

// Search for first occurrence of 'f', skipping the first 12 elements
System.out.println(StringUtils.indexOf(string, 'f', 12));

// Search for the first occurrence of the "String" string
System.out.println(StringUtils.indexOf(string, "String"));

Como resultado de pasar este código:

9
45
32

StringUtils.indexOfAny ()

El es .indexOfAny() El método asume una variedad de caracteres, en lugar de uno, lo que nos permite buscar la primera aparición de cualquiera de los caracteres pasados:

String string = "Checking for substrings within a String is a fairly common task in programming.";

// Search for first occurrence of 'f' or 'n', whichever comes first
System.out.println(StringUtils.indexOfAny(string, ['f', 'n']));

// Search for the first occurrence of "String" or "for", whichever comes first
System.out.println(StringUtils.indexOfAny(string, "String", "for"));

Como resultado de pasar este código:

6
9

StringUtils.indexOfAnyBut ()

El es .indexOfAnyBut() el modo de búsqueda busca el primer episodio de cualquier personaje que ocurra no en el conjunto provisto:

String string = "Checking for substrings within a String is a fairly common task in programming.";

// Search for first character outside of the provided set 'C' and 'h'
System.out.println(StringUtils.indexOfAny(string, ['C', 'h']));

// Search for first character outside of the provided set 'C' and 'h'
System.out.println(StringUtils.indexOfAny(string, ["Checking", "for"]));

Como resultado de pasar este código:

2
14

StringUtils.indexOfDifference ()

El es .indexOfDifference() el método compara dos matrices de caracteres y devuelve el índice de los primeros caracteres diferentes:

String s1 = "Hello World!"
String s2 = "Hello world!"

System.out.println(StringUtils.indexOfDifference(s1, s2));

Como resultado de pasar este código:

6

StringUtils.indexOfIgnoreCase ()

El es .indexOfIgnoreCase() el método devolverá el índice la primera vez que ocurrió un carácter en una secuencia de caracteres, ignorando su caso:

String string = "Checking for substrings within a String is a fairly common task in programming."

System.out.println(StringUtils.indexOf(string, 'c'));
System.out.println(StringUtils.indexOfIgnoreCase(string, 'c'));

Como resultado de pasar este código:

3
0

StringUtils.lastIndexOf ()

Y finalmente, el .lastIndexOf() el método funciona casi igual que el método básico de Java normal:

String string = "Lorem ipsum dolor sit amet.";

// You can also use unicode for characters
System.out.println(StringUtils.lastIndexOf(string, 'i'));
System.out.println(StringUtils.lastIndexOf(string, 'i', 8));
System.out.println(StringUtils.lastIndexOf(string, "dolor"));
System.out.println(StringUtils.lastIndexOf(string, "Lorem", 10));

Como resultado de pasar este código:

19
6
12
0

StringUtils.containsIgnoreCase ()

El es .containsIgnoreCase() comprueba si hay un sustrato en String, ignorando el caso:

String string = "Checking for substrings within a String is a fairly common task in programming.";

System.out.println(StringUtils.containsIgnoreCase(string, "cOmMOn tAsK"));

Como resultado de pasar este código:

true

StringUtils.containsOnly ()

El es .containsOnly() comprueba los métodos si solo se especifican los valores en una secuencia de caracteres.

Esto puede ser un poco engañoso, por lo que es otra forma de decirlo: comprueba si la secuencia de caracteres se compone únicamente de los caracteres especificados. Asume una cadena o secuencia de caracteres:

String string = "Hello World!"
System.out.println(StringUtils.containsOnly(string, 'HleWord!'));
System.out.println(StringUtils.containsOnly(string, "wrld"));

Esto resultará en:

true
false

El es "Hello World!" De hecho, se toma una cadena de caracteres en el 'HleWord!' secuencia.

Nota: No es necesario utilizar todos los caracteres de la secuencia en la string para devolver el método verdadero. Más importante string no hay ningún carácter que no esté en la secuencia de caracteres.

StringUtils.containsNone ()

El es .containsNone() significa comprueba si alguno de los caracteres “prohibidos” está fuera de un conjunto en la Cadena. Si es así, false se devuelve, y viceversa:

String string = "Hello World!"
System.out.println(StringUtils.containsNone(string, 'xmt'));
System.out.println(StringUtils.containsNone(string, "wrld"));

Resultado de este código:

true
false

StringUtils.containsAny ()

Y finalmente, el .containsAny() devuelve el método true si alguno de los parámetros pasados ​​está en forma de secuencia de caracteres o Cadena en secuencia de caracteres:

String string = "Hello World!"
System.out.println(StringUtils.containsAny(string, ['h', 'm']));
System.out.println(StringUtils.containsAny(string, "hell"));

Este código daría:

true
true

Conclusión

Finalmente, hay muchas formas de verificar un sustrato en una cadena. El enfoque básico de Java es suficiente en la mayoría de los casos, pero si necesita verificar más de una condición, Apache Commons ahorra tiempo real.

En muchos casos, defina una lógica propia para un método como .indexOfAnyBut() sería doloroso y solo excesivo. Dado que la mayoría de los proyectos actuales tienen Apache Commons, lo más probable es que pueda utilizar los métodos proporcionados por StringUtils sonó.

.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad