Coincidencia de caracteres especiales con expresión regular


10

Digamos que es muy fácil si quiero encontrar algo que contenga letras minúsculas y números con

producir_texto | grep -E '[0-9a-z]'

Los corchetes son útiles para unir un conjunto de caracteres, pero ¿qué pasa con los que son algo especiales?
Si quiero, usando corchetes, coincida con cualquier carácter que no sea uno de estos: un corchete de cierre ], un guión (o guión) "-", ambas barras /y \, un cursor ^, dos puntos :.
¿Se verá así (sé que esto no funciona)?

[^] - / \ ^:]

Respuestas:


11

Para hacer coincidir un literal ]y un literal -en una Expresión de paréntesis , deberá usarlos así:

[^]/\^:-]

o, mejor aún, ya que algunas herramientas requieren que se escape la barra invertida :

[^]/\\^:-]

es decir
, el corchete derecho (']') perderá su significado especial y se representará a sí mismo en una expresión de corchete si aparece primero en la lista (después de un '^' inicial, si lo hay)
y
el carácter de guión menos ser tratado como si ocurriera primero (después de un '^' inicial, si lo hubiera) o el último en la lista, por lo
tanto,
si una expresión de paréntesis especifica '-' y ']', el ']' se colocará primero (después del '^', si corresponde) y el '-' duran dentro de la expresión de paréntesis
Las reglas para las expresiones de paréntesis son las mismas para ERE y BRE .


2
Doblaría la barra invertida para estar seguro. Es necesario con muchas awkimplementaciones y, perlpor ejemplo.
Stéphane Chazelas

¿Qué pasa con "De caret a corchete de cierre"? ¿Me gusta [^-]](este falla)?
iBug

2
@iBug: asegúrese de que falla, ya que el corchete correcto debe ser el primero si desea hacer coincidirlo literalmente. No estoy seguro de que llegue el punto de que "rango" que lo menciona como ^es después de ]lo que [^-]]no funcionaría incluso si ambos ^y ]fue tratado literalmente (al igual que [b-a]). De todos modos, si desea hacer coincidir, por ejemplo, el ;corchete de cierre, puede usar un rango hasta el carácter anterior ](que es la barra invertida) e incluirlo ]como primer carácter en la expresión del paréntesis, por ejemplo [];-\\].
don_crissti

@don_crissti ¿Qué pasa [[.^.]-[.-.]]? Tengo la sensación de que esto funcionaría. Supongamos que el código ASCII de ^es anterior -.
iBug

Tengo una solución perezosa para mi pregunta. Simplemente obtenga todo lo especial para cotejar personajes, como[^[.].][.-.]/\^:]
iBug

7

Por extraño que parezca, necesitas tener un par de personajes en lugares específicos. Debe tener ]como primer personaje de un conjunto y -debe ser el último personaje de un conjunto.

Aquí hay un RE que cumple con sus requisitos [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
No es realmente extraño, solo es necesario para evitar la ambigüedad
Kevin

1
El segundo [personaje no pertenece allí; el OP no quiere excluirlo.
Scott

@Scott bien visto, gracias. Respuesta actualizada
roaima
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.