Cómo comprobar si una cadena contiene caracteres especiales en Java

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo verificar si una cadena contiene caracteres especiales en Java utilizando expresiones regulares. Comenzaremos definiendo los caracteres especiales mediante patrones de expresiones regulares, comprendiendo los caracteres especiales comunes y su uso.

Después de definir los caracteres especiales, explorarás cómo utilizar el método Pattern.matches() para determinar de manera eficiente si una cadena contiene alguno de los caracteres especiales definidos. Finalmente, aprenderás cómo contar las ocurrencias de caracteres especiales dentro de una cadena dada, lo que te proporcionará una comprensión integral del manejo de caracteres especiales en Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/StringManipulationGroup -.-> java/regex("RegEx") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/regex -.-> lab-559981{{"Cómo comprobar si una cadena contiene caracteres especiales en Java"}} java/string_methods -.-> lab-559981{{"Cómo comprobar si una cadena contiene caracteres especiales en Java"}} end

Definir Caracteres Especiales con Expresiones Regulares

En este paso, aprenderemos cómo definir caracteres especiales utilizando expresiones regulares (regex) en Java. Las expresiones regulares son herramientas poderosas para la coincidencia de patrones en cadenas. Los caracteres especiales en las expresiones regulares tienen significados específicos y se utilizan para definir patrones.

Aquí hay algunos caracteres especiales comunes en las expresiones regulares:

  • .: Coincide con cualquier carácter individual (excepto salto de línea).
  • *: Coincide con el elemento anterior cero o más veces.
  • +: Coincide con el elemento anterior una o más veces.
  • ?: Coincide con el elemento anterior cero o una vez.
  • []: Coincide con cualquier carácter individual dentro de los corchetes.
  • |: Actúa como un operador OR.
  • (): Agrupa elementos juntos.
  • \: Escapa un carácter especial, haciéndolo coincidir con el carácter literal.

Por ejemplo, si queremos coincidir con cualquier dígito, podemos usar \d. Si queremos coincidir con cualquier no dígito, usamos \D. Del mismo modo, \s coincide con cualquier carácter de espacio en blanco, y \S coincide con cualquier carácter que no sea de espacio en blanco.

Vamos a crear un simple programa en Java para demostrar cómo definir un patrón de expresión regular para caracteres especiales.

  1. Abre el archivo HelloJava.java en el editor WebIDE si no está abierto.

  2. Reemplaza todo el contenido del archivo con el siguiente código:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text = "Hello! This is a test string with some special characters: @#$%^&*()_+";
            // Define a regex pattern to match special characters
            String regex = "[^a-zA-Z0-9\\s]";
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
    
            System.out.println("Original String: " + text);
            System.out.println("Regex Pattern: " + regex);
    
            System.out.print("Special characters found: ");
            while (matcher.find()) {
                System.out.print(matcher.group() + " ");
            }
            System.out.println(); // Print a newline at the end
        }
    }

    Vamos a entender las nuevas partes de este código:

    • import java.util.regex.Matcher; y import java.util.regex.Pattern;: Estas líneas importan las clases necesarias para trabajar con expresiones regulares en Java.
    • String regex = "[^a-zA-Z0-9\\s]";: Esta línea define nuestro patrón de expresión regular.
      • []: Esta es una clase de caracteres, lo que significa que coincidirá con cualquier carácter individual dentro de los corchetes.
      • ^: Cuando se utiliza al principio de una clase de caracteres ([^...]), niega la clase, lo que significa que coincidirá con cualquier carácter que no esté en la clase.
      • a-zA-Z0-9: Esto coincide con cualquier letra minúscula (de a a z), cualquier letra mayúscula (de A a Z) o cualquier dígito (de 0 a 9).
      • \\s: Esto coincide con cualquier carácter de espacio en blanco (espacio, tabulación, salto de línea, etc.). Usamos \\ porque \ es un carácter especial en las cadenas de Java y debe ser escapado.
      • Entonces, todo el patrón [^a-zA-Z0-9\\s] coincide con cualquier carácter que no sea una letra, un dígito o un carácter de espacio en blanco. Estos son nuestros "caracteres especiales" en este contexto.
    • Pattern pattern = Pattern.compile(regex);: Esta línea compila el patrón de expresión regular en un objeto Pattern. Compilar el patrón mejora el rendimiento si se utiliza el mismo patrón varias veces.
    • Matcher matcher = pattern.matcher(text);: Esta línea crea un objeto Matcher, que se utiliza para realizar operaciones de coincidencia en la cadena de entrada (text) utilizando el patrón compilado.
    • while (matcher.find()): Este bucle encuentra la siguiente subsecuencia de la secuencia de entrada que coincide con el patrón.
    • matcher.group(): Esto devuelve la subsecuencia coincidente.
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Compila el programa utilizando el comando javac en la Terminal:

    javac HelloJava.java
  5. Ejecuta el programa compilado utilizando el comando java:

    java HelloJava

    Deberías ver una salida similar a esta:

    Original String: Hello! This is a test string with some special characters: @#$%^&*()_+
    Regex Pattern: [^a-zA-Z0-9\s]
    Special characters found: ! : @ ## $ % ^ & * ( ) _ +

Has definido con éxito un patrón de expresión regular para identificar caracteres especiales y lo has utilizado en un programa de Java.

Usar Pattern.matches() para Caracteres Especiales

En este paso, exploraremos otra forma de usar expresiones regulares en Java: el método Pattern.matches(). A diferencia del objeto Matcher que usamos en el paso anterior para encontrar todas las ocurrencias de un patrón, Pattern.matches() verifica si la cadena de entrada entera coincide con la expresión regular dada.

Este método es útil cuando quieres validar si una cadena se ajusta a un formato específico, como comprobar si una contraseña contiene al menos un carácter especial o si un nombre de usuario solo contiene caracteres permitidos.

Modifiquemos nuestro programa HelloJava.java para usar Pattern.matches() y comprobar si una cadena contiene algún carácter especial según la expresión regular que definimos anteriormente.

  1. Abre el archivo HelloJava.java en el editor WebIDE.

  2. Reemplaza el código existente con lo siguiente:

    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text1 = "Hello World";
            String text2 = "Hello World!";
            // Define a regex pattern to check for the presence of special characters
            // This pattern checks if the string contains at least one character that is NOT a letter, digit, or whitespace
            String regex = ".*[^a-zA-Z0-9\\s].*";
    
            boolean containsSpecial1 = Pattern.matches(regex, text1);
            boolean containsSpecial2 = Pattern.matches(regex, text2);
    
            System.out.println("String 1: \"" + text1 + "\"");
            System.out.println("Contains special characters? " + containsSpecial1);
    
            System.out.println("String 2: \"" + text2 + "\"");
            System.out.println("Contains special characters? " + containsSpecial2);
        }
    }

    Veamos los cambios:

    • Solo necesitamos importar java.util.regex.Pattern; para este método.
    • El patrón de expresión regular ahora es .*[^a-zA-Z0-9\\s].*. Desglosémoslo:
      • .*: Esto coincide con cualquier carácter (.) cero o más veces (*). El primer .* coincide con cualquier cosa antes del carácter especial.
      • [^a-zA-Z0-9\\s]: Esta es la misma clase de caracteres del paso anterior, que coincide con un solo carácter especial.
      • .*: Esto coincide con cualquier carácter (.) cero o más veces (*). El segundo .* coincide con cualquier cosa después del carácter especial.
      • En conjunto, .*[^a-zA-Z0-9\\s].* significa "coincidir con cualquier cadena que contenga al menos un carácter que no sea una letra, un dígito o un espacio en blanco".
    • Pattern.matches(regex, text1): Este método estático de la clase Pattern toma el patrón de expresión regular y la cadena de entrada como argumentos y devuelve true si la cadena entera coincide con el patrón, y false en caso contrario.
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Compila el programa:

    javac HelloJava.java
  5. Ejecuta el programa:

    java HelloJava

    Deberías ver la siguiente salida:

    String 1: "Hello World"
    Contains special characters? false
    String 2: "Hello World!"
    Contains special characters? true

Esta salida muestra que Pattern.matches() identificó correctamente que la segunda cadena contiene un carácter especial (!) mientras que la primera no.

Contar Caracteres Especiales en una Cadena

En este último paso, combinaremos lo que hemos aprendido sobre la definición de patrones de expresiones regulares y el uso del objeto Matcher para contar el número de caracteres especiales en una cadena dada. Esta es una aplicación práctica de las expresiones regulares para el análisis o validación de datos.

Utilizaremos el mismo patrón de expresión regular del Paso 1 ([^a-zA-Z0-9\\s]) para identificar los caracteres especiales y recorrer la cadena utilizando el Matcher para contar cuántas veces se encuentra el patrón.

  1. Abre el archivo HelloJava.java en el editor WebIDE.

  2. Reemplaza el código existente con lo siguiente:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text = "This string has 5 special characters: !@#$%";
            // Define a regex pattern to match special characters
            String regex = "[^a-zA-Z0-9\\s]";
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
    
            int count = 0;
            while (matcher.find()) {
                count++;
            }
    
            System.out.println("Original String: \"" + text + "\"");
            System.out.println("Regex Pattern: " + regex);
            System.out.println("Number of special characters found: " + count);
        }
    }

    Esto es lo que sucede en el nuevo código:

    • Volvemos a importar las clases Matcher y Pattern.
    • Utilizamos el mismo patrón de expresión regular [^a-zA-Z0-9\\s] para coincidir con caracteres especiales individuales.
    • Inicializamos una variable entera count en 0.
    • El bucle while (matcher.find()) recorre la cadena, y cada vez que el método matcher.find() encuentra una coincidencia para el patrón, se ejecuta el código dentro del bucle.
    • Dentro del bucle, incrementamos la variable count en 1 por cada carácter especial encontrado.
    • Finalmente, imprimimos el recuento total de caracteres especiales.
  3. Guarda el archivo (Ctrl+S o Cmd+S).

  4. Compila el programa:

    javac HelloJava.java
  5. Ejecuta el programa:

    java HelloJava

    Deberías ver la siguiente salida:

    Original String: "This string has 5 special characters: !@#$%"
    Regex Pattern: [^a-zA-Z0-9\s]
    Number of special characters found: 5

La salida muestra correctamente que hay 5 caracteres especiales en la cadena proporcionada. Has utilizado con éxito las expresiones regulares y el objeto Matcher para contar caracteres específicos en una cadena.

Resumen

En este laboratorio (lab), aprendimos cómo definir caracteres especiales utilizando expresiones regulares (regex) en Java. Exploramos los caracteres especiales comunes de las expresiones regulares y sus significados, como ., *, +, ?, [], |, () y \. También vimos cómo usar clases de caracteres predefinidas como \d, \D, \s y \S.

Luego aprendimos cómo usar el método Pattern.matches() para comprobar si una cadena contiene caracteres especiales según un patrón de expresión regular definido. Finalmente, exploramos cómo contar las ocurrencias de caracteres especiales dentro de una cadena utilizando el método Matcher.find() y recorriendo las coincidencias.