La voix du secrétaire (Jean)
Présents à la réunion, en fonction de la disposition autour de la table :
Nous avons mangé une entrecôte, une pizza 3 fromages, une pizza 4 saisons, une pizza au saumon, une pizza calzone (sans fromage) un tiramisu, une coupe colonel, une crème caramel (je crois). Nous avons bu un kir, de l'Orangina, de la bière et un déca. Le lemoncello était offert par le restaurant.
Nous avons parlé de Perl, Internet informatique et points divers.
Ceci est un; exemple; de; texte avec des; points-virgules; "à l'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici; * * * * * . . * * *Il a demandé à Chat GPT
Peux tu générer les programme perl avec une regex qui va supprimer tous les ";" qui ne sont pas entre quotes ?et il a obtenu la réponse suivante :
Bien sûr ! Voici un exemple de programme Perl qui utilise une expression régulière pour supprimer tous les points-virgules qui ne sont pas entre guillemets :J'ai essayé ce bout de code et j'ai obtenu le messagemy $texte = 'Ceci est un; exemple; de; texte avec des; points-virgules; "à l\'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici;'; $texte =~ s/(?<!["'].*);(?!.*["'])//g; print $texte;Explication de l'expression régulière :
* (?<!["'].*);: Cela utilise un negative lookbehind pour s'assurer qu'il n'y a pas de guillemets simples ou doubles avant le point-virgule.
* (?!.*["']): Cela utilise un negative lookahead pour s'assurer qu'il n'y a pas de guillemets simples ou doubles après le point-virgule.
La fonction s/// est utilisée pour effectuer le remplacement, et le //g à la fin de l'expression régulière indique de remplacer toutes les occurrences dans la chaîne.
Après l'exécution du programme, les points-virgules qui ne sont pas entre guillemets seront supprimés. Vous pouvez ajuster le texte d'entrée selon vos besoins.
Lookbehind longer than 255 not implemented in regex m/(?<!["'].*);(?!.*["'])/ at points-virgules line 4.En effet, dans l'assertion (?<!["'].*), il n'existe aucun garde-fou pour limiter la longueur de la chaîne, même si la chaîne utilisée fait moins de 255 caractères, comme c'est le cas ici. Voir en annexe quelques réflexions complémentaires sur le sujet.
my $texte = 'Ceci est un; exemple; de; texte avec des; points-virgules; "à l\'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici;'; $texte =~ s/(?<!["'].{0,254});(?!.*["'])//g; print $texte;Résultat
Variable length lookbehind is experimental in regex; marked by <-- HERE in m/(?<!["'].{0,254});(?!.*["']) <-- HERE / at points-virgules line 5. Ceci est un; exemple; de; texte avec des; points-virgules; "à l'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici;D'une part cela ne fonctionne pas, les points-virgules sont encore là et d'autre part j'ai un message d'avertissement.
les ";" qui ne sont pas entre quotesUne autre façon de formuler aurait été
les ";" qui ne sont pas précédés et suivis par au moins une quoteLa logique mathématique reformule cela en :
les ";" qui ne sont pas précédés par au moins une quote OU qui ne sont pas suivis par au moins une quotetandis que la logique « littéraire » reformule cela en :
les ";" qui ne sont pas précédés par au moins une quote ET qui ne sont pas suivis par au moins une quoteDans la chaîne
Ceci est un; exemple; de; texte avec des; points-virgules; "à l'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici; + + + + + . . * * *les points-vigules soulignés par un « + » ne sont pas précédés par des quotes, donc ils sont sélectionnés par la condition obtenue par la logique mathématique, mais ils sont suivis par au moins une quote, donc il ne sont pas sélectionnés par la condition provenant de la logique « littéraire » et par l'expression régulière de Chat GPT. De même les points-vigules soulignés par une « * » ne sont pas suivis par des quotes, donc ils sont sélectionnés par la condition déterminée par la logique mathématique, mais ils sont précédés par au moins une quote, donc il ne sont pas sélectionnés par la condition obtenue par la logique « littéraire » et par l'expression régulière de Chat GPT. On peut donc voir que Chat GPT a appliqué la logique « littéraire », alors que les expressions régulières en Perl appliquent la logique mathématique.
my $texte = 'Ceci est un; exemple; de; texte avec des; points-virgules; "à l\'intérieur de guillemets; et aussi ici; et là" et encore un; autre exemple; ici;'; $texte =~ s/(?<!["'].{0,254});//g; $texte =~ s/;(?!.*["'])//g; say $texte;
Votre question mentionne à la fois les guillemets et les points-virgules. Cela me fait penser naturellement au format CSV, dans sa version évoluée. Pouvez-vous me dire ce qui se passe avec la ligne suivante ?Et s'il s'avère que c'est la seconde interprétation qui est la bonne, alors j'aurais conseillé de regarder du côté des modules Perl pour analyser le CSV, avec une préférence pour H. Merijn, qui m'inspire plus confiance que Chat GPT.donnée 1;donnée 2 ; "donnée ; 3 ; compliquée" ; donnée 4 ; donnée 5 ; "donnée ; 6 ; compliquée" ; donnée 7 + + a * * b ? ? ? c * * d +Il ne fait aucun doute que les points-virgules soulignés par des « + » doivent être supprimés et que les points-virgules soulignés par des « * » doivent être conservés. En revanche, que faut-il faire des points-virgules soulignés par des « ? » ? Dans un sens, ils sont à la fois précédés par des doubles-quotes (« a » et « b ») et suivis par d'autres doubles-quotes (« c » et « d »), donc ils devraient être conservés. Dans un autre sens, la double-quote « a » est appariée à la double-quote « b » et la double-quote « c » est appariée à la double-quote « d », donc les trois points-virgules soulignés par « ? » ne figurent pas entre des doubles-quotes appariées et devraient être supprimés. Quelle interprétation faut-il utiliser ? Et je ne parle pas des caractères d'échappement...