J'ai récemment entamé une discussion amicale avec Ghoti sur ce qui constitue une expression régulière dans les commentaires de ma réponse à cette question. J'ai affirmé que ce qui suit est une expression régulière:
`[Rr]eading[Tt]est[Dd]ata`
Ghoti n'était pas d'accord, affirmant qu'il s'agissait plutôt d'un fichier global. La page globale sur wikipedia affirme que (c'est moi qui souligne):
Les globes n'incluent pas de syntaxe pour l'étoile Kleene qui autorise plusieurs répétitions de la partie précédente de l'expression; elles ne sont donc pas considérées comme des expressions régulières, ce qui peut décrire un plus grand ensemble de langues régulières sur un alphabet fini donné.
Cependant, il n'y a aucune citation pour cette affirmation, indiquant qu'il ne s'agit que de l'opinion d'un éditeur de Wikipédia particulier.
La spécification Single UNIX ®, version 2 , stipule qu'une expression régulière de base (BRE) peut même être un seul caractère:
Un caractère ordinaire est un BRE qui correspond à lui-même: tout caractère du jeu de caractères pris en charge, à l'exception des caractères spéciaux BRE répertoriés dans BRE Caractères spéciaux.
Alors, quelle est la définition d'une expression régulière dans le monde * nix, et cette définition exclut-elle les globes de fichiers?
la source
grep
,sed
etawk
. Vim utilise sa propre variété, tout comme Perl.*
a deux significations différentes dans BRE et globs. Remarque: Je ne pense pas que le terme glob soit utilisé n'importe où dans la spécification POSIX - il s'appelle plutôt Pattern Matching et est décrit dans le chapitre sur le langage shell.Réponses:
Comme dit lk-, l'
-name
option defind
traitera l'argument comme un glob, et non comme une expression régulière.Qu'une chaîne soit interprétée comme un glob ou une regex ou simplement une chaîne ordinaire dépend de ce qui est utilisé pour faire l'interprétation. C'est une question de contexte. La chaîne dans votre exemple,
[Rr]eading[Tt]est[Dd]ata
peut être évaluée dans un certain nombre de façons différentes, mais ce qu'elle est dépend de la façon dont vous l' utilisez. Utilisez-le comme un glob, c'est un glob. Utilisez-le comme une expression régulière, c'est une expression régulière. Dans le cas de la question d'origine , l'OP a décrit la chaîne comme une expression régulière. Par conséquent, nous pouvons supposer qu'il prévoyait de l'interpréter comme une expression régulière.Un seul caractère peut également être une expression régulière, absolument. Il peut également s'agir d'une chaîne et d'un glob. Il peut être interprété comme un octet ou un minuscule, si vous le souhaitez. Tout dépend du contexte.
Il existe un certain nombre de spécifications pour les expressions régulières sous différentes formes. BRE et ERE sont bien documentés. PCRE ajoute des tas de fonctionnalités. De nombreux interprètes d'expression régulière implémenteront, par exemple, "tous les ERE et certains de PCRE". Ou ils feront ERE moins certaines fonctionnalités. Si vous respectez des spécifications formelles, de nombreux outils réclament un support regex qui s'avère incorrect ou incomplet. Connaître les détails vous permet d'adapter vos solutions à la collection de fonctionnalités disponibles dans n'importe quel outil qui évalue votre expression régulière.
Donc ... si vous cherchez des définitions qui "excluent" les globes, vous regardez cela sous un mauvais angle. Ce que c'est est déterminé par la façon dont vous l'utilisez .
la source
[Rr]eading[Tt]est[Dd]ata
semble être valable à la fois comme un glob et une expression régulière, et je crois qu'il a le même "sens" dans les deux interprétations. Cependant, l'-name
option defind
traitera l'argument comme un glob, et non comme une expression régulière.Cette distinction importera si vous fournissez un argument tel que
foo*
, qui est à la fois un glob valide et une expression régulière valide, mais qui a une signification différente selon l'interprétation:Si elle est interprétée comme un modèle glob, cela correspond
foo
,foobar
,foo123
, etc.Si elle est interprétée comme une expression régulière, cela correspondra
fo
,foo
,foooooo
, etc.la source