• [^] # RegExp

    Posté par (site web personnel, Mastodon) . En réponse au lien sudo & su Being Rewritten In Rust For Memory Safety - phoronix. Évalué à 3. Dernière modification le 02 mai 2023 à 23:20.

    Comme je l'explique dans un tuto en cours, ça dépend fortement du moteur d'expression rationnelle sous-jacent.

    • Dans Vim, je ne sais pas à partir de quelle version, il y a \& comment pendant de \| qui fait que la recherche serait /toto\&tata/ ou /tata\&toto/ ;-)
    • Dans les moteurs compatibles Perl, on peut utiliser les lookahead ou lookbehind que ne contient pas POSIX et qui sont repris dans Java : on pourrait avoir quelque chose comme `grep -P '?=.*\toto\b)(?=.\btata\b).$'
    • De façon purement POSIX, qui sacrifie les fonctionnalités à la performance, il n'y a pas de « et logique » et il faut explicitement mettre les deux altérations : grep 'toto.*tata\|tata.*toto' ou grep -E 'toto.*tata|tata.*toto'
    • Ici, on est dans un cas simple où on pourrait utiliser la règle logique « "/A AND B/" = "/NOT (NOT A OR NOT B)/" » ; mais la négation n'est pas toujours le plus simple à exprimer dans ces cas, et certaines implémentations PCRE pourraient comprendre « "/(^(^A|^B))/" » —soit grep -P '(^(^toto|^tata))' ou grep -P '(^(^tata|^toto))'

    Ce qui est certain :

    il faudrait que j'aille regarder le manuel des regex pour retrouver le même comportement

    Si on n'a pas pris la peine de se former aux expressions rationnelles, la page de manuel ne sera pas d'un grand secours pour savoir comment retrouver la bonne incantation.

    "It is seldom that liberty of any kind is lost all at once." ― David Hume