Quelle est la définition d'une expression régulière?

10

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?

terdon
la source
6
En CS théorique, une expression régulière est une description d'un langage régulier, qui peut être reconnu par un automate fini. Dans le monde Unix, c'est beaucoup plus compliqué et il n'y a pas de définition unique. Il y a 2 dialectes regex dans la spécification POSIX: extension et de base, qui sont utilisés par des outils comme grep, sedet awk. Vim utilise sa propre variété, tout comme Perl.
jw013
Donc, selon cette définition, un fichier glob est un BRE, n'est-ce pas?
terdon
2
Non, un fichier glob n'est PAS un BRE - qu'est-ce qui vous fait penser qu'il l'est? Si vous lisez la description POSIX de BRE et la description POSIX de globbing, vous remarquerez qu'elles ne sont pas identiques. Par exemple, *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.
jw013
Voir aussi Pourquoi mon expression régulière fonctionne-t-elle en X mais pas en Y?
Gilles 'SO- arrête d'être méchant'

Réponses:

10

Comme dit lk-, l' -nameoption de findtraitera 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]atapeut ê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 .

ghoti
la source
7

[Rr]eading[Tt]est[Dd]atasemble ê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' -nameoption de findtraitera 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.

lk-
la source
Merci, je vois la différence entre un motif glob et un regex. Quelle est cependant la définition officielle d'une expression régulière?
terdon
1
Je ne sais pas s'il existe une définition unique des "expressions régulières" car le terme est couramment utilisé. Il existe différentes spécifications de syntaxe, telles que les expressions régulières POSIX ou les expressions régulières Perl, qui incluent d'autres "fonctionnalités" telles que les références arrières ou les recherches. Il ne s'agit peut-être plus d'expressions régulières au sens strict (dans le contexte des langages formels réguliers), mais elles sont toujours désignées comme telles.
lk-