GNU/Linux >> Tutoriels Linux >  >> Linux

La définition d'une expression régulière ?

J'ai récemment eu une dispute amicale avec Ghoti sur ce qui constitue une expression régulière dans les commentaires de ma réponse à cette question. J'ai prétendu 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 glob de fichiers. La page glob sur wikipedia affirme que (c'est moi qui souligne):

Les globs n'incluent pas la syntaxe de l'étoile de Kleene qui permet de multiples
répétitions de la partie précédente de l'expression ; ainsi, ils ne sont pas
considérés comme des expressions régulières, qui peuvent décrire un plus grand ensemble de
langages réguliers sur n'importe quel alphabet fini donné.

Cependant, il n'y a pas de citation pour cette affirmation, ce qui indique qu'il ne s'agit que de l'opinion d'un éditeur de wikipedia particulier.

La spécification The 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 dans
le jeu de caractères pris en charge, à l'exception des caractères spéciaux BRE
répertoriés dans BRE Special Characters .

Alors, quelle est la définition d'une expression régulière dans le monde *nix, et cette définition exclut-elle les globs de fichiers ?

Réponse acceptée :

Comme lk- l'a dit, le -name option de find traitera l'argument comme un glob, pas 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 simple 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é de différentes manières, mais ce qu'il est dépend de la façon dont vous l'utilisez. Utilisez-le comme un glob, c'est un glob. Utilisez-le comme une regex, c'est une regex. Dans le cas de la question d'où cela provient, 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 aussi être une regex, absolument. Il peut également s'agir d'une chaîne, et il peut également s'agir d'un glob. Il peut être interprété comme un octet ou un tinyint, si vous le souhaitez. Tout dépend du contexte.

Il existe un certain nombre de spécifications pour les expressions régulières sous diverses formes. BRE et ERE sont bien documentés. PCRE ajoute des tas de fonctionnalités. De nombreux interpréteurs de regex implémenteront, par exemple, "tout ERE et une partie de PCRE". Ou ils feront ERE moins une fonctionnalité. Si vous vous fiez aux spécifications formelles, de nombreux outils revendiquent un support regex qui s'avère incorrect ou incomplet. Connaître les détails vous permet d'adapter vos solutions à l'ensemble des fonctionnalités disponibles dans l'outil qui évalue votre regex.

Connexe :la commande `ls` ne répertorie pas le dernier contenu du répertoire ?

Donc… si vous cherchez des définitions qui "excluent" les globs, vous regardez cela du mauvais point de vue. Qu'est-ce que c'est est déterminé par la façon dont vous l'utilisez .


Linux
  1. Pourquoi l'expression régulière fonctionne-t-elle dans X mais pas dans Y ?

  2. Bash + Vérifier le nom par expression régulière ?

  3. Pourquoi sed n'utilise-t-il pas le mode regex étendu par défaut ?

  4. Quelle est la regex pour valider les utilisateurs Linux ?

  5. grep extraire la plage de numéros

Initiation aux expressions régulières

Expressions régulières dans Grep (Regex)

10 exemples pratiques de regex avec grep

Expression régulière pour trouver des caractères doubles dans Bash

Expression régulière avec sed

Définition de la variable TEXINPUTS