es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué esta expresión regular “.*” coincide dos veces con “abcd 1234 abcd”?

¿Por qué obtengo dos coincidencias al usar la expresión regular .* en la cadena abcd 1234 abcd? Ver https://regex101.com/r/rV8jfz/1.

A partir de la explicación dada por regex101, puedo ver que la segunda coincidencia ocurrió en la posición 14-14 y el valor coincidido es nulo. Pero ¿por qué se hace una segunda coincidencia? ¿Hay alguna forma de evitar la segunda coincidencia?

Entiendo que .* significa cero o más de cualquier carácter, por lo que está tratando de encontrar cero ocurrencias. Pero no entiendo por qué se requiere esta coincidencia nula.
El problema se presenta cuando se usa en cualquier lenguaje (por ejemplo, Java), cuando hago while(matcher.find()) { ... }, esto se repetirá dos veces cuando solo quiero que se repita una vez.

Sé que esto podría no ser una situación real de coincidencia, pero para entender y explorar las expresiones regulares, lo veo como un buen caso de estudio.

Editar – siguiendo la respuesta de @terdon.
Me gustaría mantener la opción /g en regex101, soy consciente de ello. Me gustaría saber todas las coincidencias posibles.
https://regex101.com/r/EvOoAr/1 -> el patrón abcd en la cadena abcd 1234 abcd da dos coincidencias. Y quiero conocer esta información.

El problema que encuentro es cuando se trata esto en un lenguaje como Java.
Ref – https://onecompiler.com/java/3xnax494k

String str = “abcd 1234 abcd”;
Pattern p = Pattern.compile(“.*”);
Matcher matcher = p.matcher(str);
int matchCount=0;
while(matcher.find()) {
matchCount++;
System.out.println(“match number: ” + matchCount);
System.out.println(“matcher.groupCount(): ” + matcher.groupCount());
System.out.println(“matcher.group(): ” + matcher.group());
}

La salida es:

match number: 1
matcher.groupCount(): 0 // puedes ignorar esto
matcher.group(): abcd 1234 abcd
match number: 2
matcher.groupCount(): 0
matcher.group(): // este es mi problema. El programa debe lidiar de alguna manera con esta coincidencia vacía.

Sería bueno para mí como programador si el find() no hiciera coincidencias con “nada”. Debo agregar código adicional en el bucle para detectar este caso de “nada”.

Este problema de nulos (en el código) empeorará aún más con este caso de regex: https://regex101.com/r/5HuJ0R/1 -> [0-9]* en contra de abcd 1234 abcd da 12 coincidencias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que hay una segunda coincidencia al utilizar la expresión regular .* en la cadena abcd 1234 abcd es porque la primera coincidencia es abcd 1234 abcd y la segunda coincidencia es una cadena vacía en la posición 14. Esto ocurre porque la expresión .* coincide con cero o más ocurrencias de cualquier carácter y puede coincidir con nada cuando llega al final de la entrada.

    Para evitar la segunda coincidencia, puedes utilizar una expresión regular más específica que coincida únicamente con la cadena que deseas, por ejemplo, abcd. Si deseas obtener el número total de coincidencias de un patrón en una cadena en Java, puedes utilizar un bucle con el método find() del objeto Matcher e incrementar un contador por cada coincidencia. Sin embargo, debes manejar el caso en el que haya una coincidencia de longitud cero omitiéndolo en el bucle.

Comments are closed.