diferencia entre .* y * en expresión regular

diferencia entre .* y * en expresión regular

Tengo un archivo llamado "prueba" que contiene

linux
Unixlinux
Linuxunix
it's linux
l...x

Ahora, cuando lo uso grep '\<l.*x\>', coincide:

linux
it's linux
l...x

pero cuando lo uso grep '\<l*x\>', solo coincide:

l...x, pero de acuerdo con la guía de referencia, cuando se usa * , el elemento anterior coincidirá cero o más veces, es decir, debe coincidir con cualquier cosa que comience con 'l' y termine con 'x'.

¿Alguien puede explicar por qué no muestra el resultado deseado o si lo he entendido mal?

Respuesta1

notación (.*)

El * en las expresiones regulares .* y * se refiere a un recuento, no a caracteres en sí, más exactamente significa'cero o más'. Además, el.medio'cualquier carácter'.

Así que cuando los juntas obtienes'cero o más de cualquier carácter'. Por ejemplo cadenas como estas:

  • Linux
  • linnnnnx
  • lnx
  • hola linux
  • lx

Sería igualado por <l.*x>. El último es importante, muestra que el.*tampoco puede igualar nada.

notación (*)

El uso de * solo, como dije, es un contador. Entonces, cuando lo pones después de una letra como'yo'el * esta diciendo'cero o más de l'.

Observe que si buscamos l*x, esto coincidirá l...x, pero probablemente no por el motivo que cree.

% echo "l...x" | grep "l*x"
l...x

Coincide con la 'x' final. La 'l' no tiene nada que ver con el motivo por el que esto coincide, aparte del hecho de que la 'x' está precedida por'cero o más unos'.

Respuesta2

Si desea hacer coincidir algo que comience con "l" y termine en "x", pruebe con la expresión regular "l.*x". Aquí "." y "*" son caracteres especiales que representan un único carácter válido y caracteres de al menos cero longitud, respectivamente. Aquí lo que precede a "*" es un ".", por lo que cualquier cosa que venga en lugar de "." se repite de acuerdo con la definición de "*" según lo anterior.

Respuesta3

Para el shell (por ejemplo, bash), cuando los comodines se usan para hacer coincidir nombres de archivos *y ?son los personajes mismos, representan los personajes.

Por otro lado, para las expresiones regulares, *, ?, {n,m}(rango de apariciones) y +( egrepsolo) no son nada en sí mismos. Siempre se refieren al personaje/átomo anterior; si se trata de un personaje real (p. ej. Lo 5), el .(comodín) que puede representar cualquier personaje, un rango de caracteres (p. ej. [a-f]) o un patrón de varios caracteres (solo egrep; p. ej. (abba)- donde "abba" se considera una unidad). Los *y ?por lo tanto no representan nada por sí solos, pero dicen algo sobre cuántas veces debe repetirse el personaje anterior (que puede ser un comodín para cualquiera o un grupo tratado como una unidad).

Una vez que recuerde esta distinción, entre la forma en que Shell y Regex usan *y ?, debería encajar.

Entonces para expresiones regulares:

  • .- representar exactamente una aparición de cualquier carácter
  • a..a- coincide con dos a con dos caracteres de cualquier tipo entre
  • .*- coincide con 0, 1 o más apariciones de cualquier personaje
  • B*- coincide con 0, 1 o más apariciones de "B"

información relacionada