Les regex sont beaucoup trop bêtes et limitées pour en faire ce que tu voudrais faire. Elles ne savent reconnaître que des motifs dans des chaînes de caractères. Donc, oui, il faut mettre toutes les formes fléchies, mais il y moyen d'abréger en ne répétant pas les éléments qui ne changent pas. Par exemple, si tu veux reconnaître les différentes formes au présent du verbe extrapoler, tu peux écrire (non testé):
/extrapol(e(s|z|nt)?|ons)/
Ce qui se lit: "extrapol", suivi soit d'un "e" (éventuellement lui-même suivi d'un "s", un "z" ou un "nt"), soit d'un "ons".
Pour les verbes réguliers, tu peux construire des sous regex à réutiliser. Pour l'indicatif (formes simples non composées) des verbes réguliers du premier groupe:
1 2 3 4 5 6 7 8
| my $imparfait = qr /(ai(s|t|ent)|ions|iez/;
my $present = qr/e(s|z|nt)?|ons/;
my $futur = qr/er(a(i|s)?|ons||ez|ent/;
my $passe_simple = qr/(a(i|s)?|â(m|t)es\èrent/;
my $indic_premier_groupe = /$present|$imparfait|$passe_simple|$futur/;
# ... autres modes
my $autres = qr/er|é|ant/;
my $conjug_premier_groupe = qr /$indic_premier_groupe|$condi_premier_groupe|$subj_premier_groupe|$autres| .../; |
Ce que j'ai mis ci-dessus est vite fait, il y a peut-être des erreurs, mais ça donne, je pense, l'idée: on construit des briques réutilisables.
Cela dit, il est très probable que quelqu'un ait déjà fait ce travail. Consulte le domaine Lingua du CPAN, tu trouveras sans doute un module mettant en œuvre une bonne partie de ce dont tu as besoin.
Partager