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 lo siguiente es una expresión regular:
`[Rr]eading[Tt]est[Dd]ata`
Ghoti no estuvo de acuerdo, alegando que es un problema de archivo. La página global en wikipedia afirma que (el énfasis es mío):
Los globos no incluyen sintaxis para la estrella de 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 idiomas regulares sobre cualquier alfabeto finito dado.
Sin embargo, no hay citas para esta afirmación, lo que indica que es solo la opinión de un editor de wikipedia en particular.
La especificación The Single UNIX ®, 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: cualquier carácter del conjunto de caracteres admitido, excepto los caracteres especiales BRE enumerados en los caracteres especiales BRE.
Entonces, ¿cuál es la definición de una expresión regular en el mundo * nix, y esa definición excluye los globos de archivos?
fuente
grep
,sed
, yawk
. Vim usa su propia variedad, al igual que Perl.*
tiene dos significados diferentes en BRE y globs. Nota: No creo que el término glob se use en ninguna parte de la especificación POSIX; en su lugar, se llama Pattern Matching y se describe en el capítulo del lenguaje de shell.Respuestas:
Como dijo lk-, la
-name
opción defind
tratará el argumento como un globo, no como una expresión regular.El hecho de que una cadena se interprete como glob o regex o simplemente como una cadena simple depende de lo que se utilice para interpretar. Es una cuestión de contexto. La cadena en su ejemplo,
[Rr]eading[Tt]est[Dd]ata
se puede evaluar en un número de maneras diferentes, pero lo que es depende de cómo se está utilizando. Ú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 personaje también puede ser una expresión regular, absolutamente. También puede ser una cadena, y también puede ser un globo. Podría ser interpretado como un byte o un tinyint, si lo desea. Todo depende del contexto.
Hay una serie de especificaciones para expresiones regulares en varias formas. BRE y ERE están bien documentados. PCRE agrega montones de funcionalidades. Muchos intérpretes de expresiones regulares implementarán, por ejemplo, "todo ERE y algunos de PCRE". O harán ERE menos alguna característica. Si sigue las especificaciones formales, muchas herramientas reclaman soporte de expresiones regulares que resulta ser incorrecto o incompleto. Conocer los detalles le permite adaptar sus soluciones a la colección de funcionalidades disponibles dentro de cualquier herramienta que esté evaluando su expresión regular.
Entonces ... si está buscando definiciones que "excluyan" los globos, lo está viendo desde una perspectiva incorrecta. Lo que se determina depende de cómo lo use .
fuente
[Rr]eading[Tt]est[Dd]ata
parece ser válido tanto como una expresión global y regular, y creo que tiene el mismo "significado" en ambas interpretaciones. Sin embargo, la-name
opción defind
tratará el argumento como un globo, no como una expresión regular.Esta distinción será importante si proporciona un argumento como
foo*
, que es a la vez un glob válido y una expresión regular válida, pero tiene un significado diferente según la interpretación:Si se interpreta como un patrón global, esto va a coincidir
foo
,foobar
,foo123
, etc.Si se interpreta como una expresión regular, esto va a coincidir
fo
,foo
,foooooo
, etc.fuente