regex - remove - ¿Por qué no coincide*cuando+hace?
En los siguientes ejemplos (a través de regex101.com, modo PCRE), no puedo entender por qué el cuantificador + encuentra una subcadena pero * no.
En la primera ilustración, el cuantificador + (1 o más) encuentra los cuatro caracteres en minúsculas (que es lo que esperaba):
En la segunda ilustración, el cuantificador * (0 o más) no encuentra caracteres en minúsculas (que NO es lo que esperaba):
¿Qué lógica REGEX explica por qué "1 o más" (+) encuentra los cuatro caracteres en minúscula y "0 o más" (*) no encuentra ninguno?
En realidad coincide con el principio de la cadena donde hay cero a. Si la cadena comienza con a, coincidirá con todas ellas.
Otras respuestas ya describen lo que está pasando. Pero para una ilustración / ejemplo, intente esto en tamaño:
$ echo AAAAaaaabbbb | egrep -o ''a*'' && echo "SUCCESS"
SUCCESS
El efecto de la opción grep -o
es mostrarle solo la parte de la entrada que coincide con la expresión regular. Dado que lo que coincidió resultó ser "cero caracteres", el resultado está vacío ... pero exitoso.
El motor de expresiones regulares intentará hacer coincidir el patrón completo en cada posición de la cadena, de izquierda a derecha. El patrón /a*/
coincide exitosamente con el cero a
s al comienzo de la cadena. Esto es lo que significa el pequeño símbolo de puntos en su captura de pantalla regex101: una coincidencia de ancho cero en esa posición. Coincidiría más a
s en esa posición, pero no hay ninguno. No obstante, el partido tiene éxito.
Si usa una función que devuelve todas las coincidencias de expresiones regulares en la cadena, entonces avanzará un mínimo de un carácter cada vez para buscar nuevas coincidencias, por lo que coincidirá con aaaa
(como un solo resultado) una vez que llegue a ella. Ejemplo en Python:
import re
regex = r"a*"
input = "AAAAaaaaBBBBbbbb"
print(re.findall(regex, input))
Salida:
['''', '''', '''', '''', ''aaaa'', '''', '''', '''', '''', '''', '''', '''', '''', '''']
Mientras que, cuando usas /a+/
, no puede hacer esas coincidencias de ancho cero, así que pasa por la entrada hasta que encuentra su primera y única coincidencia en aaaa
.