GNU/Linux >> Tutoriales Linux >  >> Linux

¿La definición de una expresión regular?

Recientemente tuve una discusión amistosa con Ghoti sobre lo que constituye una expresión regular en los comentarios a mi respuesta a esta pregunta. Afirmé que la siguiente es una expresión regular:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti no estuvo de acuerdo y afirmó que, en cambio, se trata de un archivo global. La página global en wikipedia afirma que (énfasis mío):

Los globos no incluyen la sintaxis de la estrella Kleene que permite múltiples
repeticiones de la parte anterior de la expresión; por lo tanto, no
se consideran expresiones regulares, que pueden describir un conjunto más grande de
lenguajes regulares sobre cualquier alfabeto finito dado.

Sin embargo, no hay ninguna cita para esta afirmación, lo que indica que es solo la opinión de un editor de wikipedia en particular.

The Single UNIX ® Specification, versión 2, establece que una expresión regular básica (BRE) puede ser incluso un solo carácter:

Un carácter ordinario es un BRE que coincide consigo mismo:cualquier carácter en
el conjunto de caracteres admitido, excepto los caracteres especiales BRE
enumerados en Caracteres especiales BRE .

Entonces, ¿cuál es la definición de una expresión regular en el mundo *nix? ¿Excluye esa definición los archivos globales?

Respuesta aceptada:

Como dijo lk-, el -name opción de find tratará el argumento como un globo, no como una expresión regular.

Si una cadena se interpreta como un globo o una expresión regular o simplemente como una cadena simple, depende de lo que se use para hacer la interpretación. Es una cuestión de contexto. La cadena en su ejemplo, [Rr]eading[Tt]est[Dd]ata puede evaluarse de varias maneras diferentes, pero lo que es depende de cómo lo estés usando. Úselo como un globo, es un globo. Úselo como una expresión regular, es una expresión regular. En el caso de la pregunta de dónde se originó esto, el OP describió la cadena como una expresión regular. Por lo tanto, podemos suponer que planeaba interpretarlo como una expresión regular.

Un solo carácter también puede ser una expresión regular, absolutamente. También puede ser una cadena y también puede ser un globo. Podría interpretarse como un byte o un tinyint, si lo desea. Todo depende del contexto.

Hay una serie de especificaciones para las expresiones regulares en varias formas. BRE y ERE están bien documentados. PCRE agrega toneladas de funcionalidad. Muchos intérpretes de expresiones regulares implementarán, por ejemplo, "todo ERE y algo de PCRE". O harán ERE menos alguna característica. Si sigue especificaciones formales, muchas herramientas afirman admitir expresiones regulares que resultan ser incorrectas o incompletas. Conocer los detalles le permite adaptar sus soluciones a la colección de funciones disponibles dentro de cualquier herramienta que evalúe su expresión regular.

Relacionado:¿El comando `ls` no muestra los últimos contenidos del directorio?

Entonces... si está buscando definiciones que "excluyan" los globos, lo está viendo desde la perspectiva equivocada. Qué es está determinado por cómo lo usas .


Linux
  1. ¿Por qué la expresión regular funciona en X pero no en Y?

  2. Bash + Verificar nombre por expresión regular?

  3. Bash:¿Expresiones regulares en sustitución?

  4. Cómo usar la anticipación para excluir caracteres especiales en una expresión regular

  5. ¿Cómo usa expresiones regulares con el comando cp en Linux?

Introducción a las expresiones regulares

Expresiones regulares en Grep (Regex)

10 ejemplos prácticos de expresiones regulares con grep

Expresión regular para encontrar caracteres dobles en Bash

Expresión regular con sed

rango de números de extracción de grep