Java: busque subcadena en la cadena

    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 鈥嬧媏st谩 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贸.

    .

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *