1. Información general
Las expresiones regulares se pueden usar para una variedad de tareas de procesamiento de texto, como algoritmos de conteo de palabras o validación de entradas de texto.
En este tutorial, veremos cómo usar expresiones regulares para contar el número de coincidencias en un texto .
2. Caso de uso
Desarrollemos un algoritmo capaz de contar cuántas veces aparece un correo electrónico válido en una cadena .
Para detectar una dirección de correo electrónico, usaremos un patrón de expresión regular simple:
([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])
Tenga en cuenta que este es un patrón trivial solo con fines de demostración, ya que la expresión regular real para hacer coincidir direcciones de correo electrónico válidas es bastante compleja.
Necesitaremos esta expresión regular dentro de un objeto Pattern para poder usarlo:
Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])");
Veremos dos enfoques principales, uno de los cuales depende del uso de Java 9 o posterior.
Para nuestro texto de ejemplo, intentaremos encontrar los tres correos electrónicos en la cadena:
"You can contact me through [email protected], [email protected], and [email protected]"
3. Contar coincidencias para Java 8 y versiones anteriores
En primer lugar, veamos cómo contar las coincidencias con Java 8 o anterior.
Una forma sencilla de contar las coincidencias es iterar sobre el método de búsqueda de la clase Matcher . Este método intenta encontrar la siguiente subsecuencia de la secuencia de entrada que coincide con el patrón :
Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher(TEXT_CONTAINING_EMAIL_ADDRESSES); int count = 0; while (countEmailMatcher.find()) { count++; }
Usando este enfoque, encontraremos tres coincidencias, como se esperaba:
assertEquals(3, count);
Tenga en cuenta que el método de búsqueda no restablece el Matcher después de cada coincidencia encontrada; se reanuda comenzando en el carácter después del final de la secuencia anterior coincidente, por lo que no funcionaría para encontrar direcciones de correo electrónico superpuestas.
Por ejemplo, consideremos este ejemplo:
String OVERLAPPING_EMAIL_ADDRESSES = "Try to contact us at [email protected]@baeldung.com, [email protected]"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher(OVERLAPPING_EMAIL_ADDRESSES); int count = 0; while (countOverlappingEmailsMatcher.find()) { count++; } assertEquals(2, count);
Cuando la expresión regular intenta encontrar coincidencias en la cadena dada , primero encontrará "[email protected]" como coincidencia. Como no hay una parte de dominio que preceda a @, el marcador no se restablecerá y el segundo "@ baeldung.com" se ignorará. Continuando, también considerará "[correo electrónico protegido]" como la segunda coincidencia:

Como se muestra arriba, solo tenemos dos coincidencias en el ejemplo de correo electrónico superpuesto.
4. Contar coincidencias para Java 9 y versiones posteriores
Sin embargo, si tenemos una versión más reciente de Java disponible, podemos usar el resultado método de la Matcher clase. Este método, agregado en Java 9, devuelve un flujo secuencial de resultados de coincidencias, lo que nos permite contar las coincidencias más fácilmente:
long count = countEmailMatcher.results() .count(); assertEquals(3, count);
Como vimos con find , el Matcher no se reinicia mientras se procesa la transmisión desde el método de resultados . Del mismo modo, el método de resultados tampoco funcionaría para encontrar coincidencias que se superpongan.
5. Conclusión
En este breve artículo, hemos aprendido a contar las coincidencias de una expresión regular.
En primer lugar, hemos aprendido cómo utilizar el hallazgo método con un tiempo de bucle. Luego vimos cómo el nuevo método de transmisión de Java 9 nos permite hacer esto con menos código.
Como siempre, los ejemplos de código están disponibles en GitHub.