7 votes

Créer une classe de caractères avec des symboles modificateurs en Perl 6

J'aimerais créer une classe de caractères "voyelles" définie par l'utilisateur, qui correspondrait à toute lettre voyelle anglaise littérale (a, e, i, o, u) ainsi qu'à toutes ces lettres avec tous les diacritiques possibles : u å é, etc.

C'est ce que j'ai essayé de faire, mais cela ne fonctionne pas :

> my $vowel = / <[aeiou]> <:Sk>* /
/ <[aeiou]> <:Sk>* /
> "áei" ~~ m:g/ <$vowel> /
(e i)

10voto

Håkon Hægland Points 5103

Vous pouvez essayer d'utiliser Ignorer la marque :

L'adverbe :ignoremark ou :m indique au moteur de regex de ne comparer que les caractères de base et d'ignorer les marques supplémentaires telles que les combinaisons de caractères. comparer que les caractères de base, et d'ignorer les marques additionnelles telles que les accents.

Pour votre exemple :

my $vowel = /:m<[aeiou]>/;
.say for "áeikj" ~~ m:g/ <$vowel> /;

Sortie :

á
e
i

10voto

timotimo Points 3514

La raison pour laquelle vous ne pouvez pas faire correspondre une voyelle avec un caractère de combinaison en utilisant la fonction / <[aeiou]> <:Sk>* / est que les chaînes de caractères en Perl 6 sont traitées au niveau du graphème. À ce niveau, u n'est déjà qu'un seul caractère, et <[aeiou]> étant une classe de caractères correspondant déjà à un caractère entier.

Comme Håkon l'a indiqué dans l'autre réponse, la bonne solution consiste à utiliser la fonction ignoremark adverbe. Vous pouvez le placer avant la regex comme suit rx:m/ <[aeiou]> / ou à l'intérieur de celui-ci, ou même l'allumer et l'éteindre à différents endroits avec :m et :!m .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X