Sujet : Re: Regex qui supprime tout le reste de la ligne après le premier espace
De : om+news (at) *nospam* miakinen.net (Olivier Miakinen)
Groupes : fr.comp.lang.regexpDate : 09. Dec 2024, 12:16:36
Autres entêtes
Organisation : There's no cabale
Message-ID : <vj6jjh$27hh$1@cabale.usenet-fr.net>
References : 1 2 3 4
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4
Le 09/12/2024 08:52, yamo' a écrit :
Salut,
Merci à vous deux !
Olivier Miakinen a écrit :
Le 08/12/2024 13:29, j'écrivais :
1re solution sans assertions
============================
Remplacer :
/^([^:][^ ]*?) .*/
par :
\1
Seulement ?
Oui.
Ça veut dire la chose suivante :
^ Commencer au début de la ligne
([^:][^ ]*?) Tout ce bloc sera capturé. Je le décris en détail en dessous
[^:] Le premier caractère ne doit pas être un deux-points
[^ ]*? Les caractères suivants ne doivent pas être des espaces
(espace).* Là on prend une espace puis tout ce qui suit jusqu'à la fin
Donc, d'après ce qui précède, si une ligne ne commence pas par un deux-points,
tous les premiers caractères sans espaces sont capturés par les parenthèses
(...), et à partir de la première espace c'est pris en compte mais pas capturé.
Du coup, quand on le remplace par $1 ou \1, cela veut dire qu'on ne recopie que
ce qui avait été capturé par les parenthèses.
Cette 1re solution peut convenir si ton moteur de regex n'est pas de type PCRE.
Encore un truc qui me rebute avec les regex mais c'est une des joies de
l'informatique où chacun peut développer sa norme dans son coin...
C'est surtout une raison historique. Au début les regexp n'étaient pas très
évoluées et on ne savait pas capturer avec des parenthèses, c'étaient donc
des caractères sans signification. Quand on a pensé à capturer avec des
parenthèses, ceux qui ont développé les regex améliorées ont préféré aller
au plus simple et écrire (...) pour la capture, ce qui force à écrire \( et
\) pour les protéger si on veut en faire des caractères normaux. Au contraire
dans les premières regex, pour garder la compatibilité avec l'existant on a
gardé ( et ) pour les caractères normaux et il a fallu écrire \(...\) pour
en faire des parenthèses capturantes.
Lorsque tout le monde sera passé au meilleur standard possible, à savoir PCRE
qui est devenu la norme dans tous les nouveaux langages, on ne se posera plus
de question. C'est un problème récurrent, comme les différents charsets
nationaux (CP850, CP1252, ISO-8859-1, ISO-8859-15, Shift-JIS, etc.) qui sont
de plus en plus souvent remplacés par UTF-8.
Attention, selon ton type de regex il faudra peut-être écrire \( et \) à
la place de ( et ), ou (inclusif) écrire $1 au lieu de \1.
Quand je comprends ce que je fais, j´échappe les caractères "spéciaux".
N'étant pas de type PCRE, il y a différentes « saveurs » de regex, d'où les
différences possibles.
C'est un monde étrange ces regex...
cf. supra.
2e solution avec assertions
===========================
Remplacer :
/(?<=^[^:][^ ]*?) .*/
par rien.
!?
Cette 2de solution est pour les regex de type PCRE.
Je vais regarder la solution de Jo Engo si elle fonctionne.
Oui, elle fonctionne parfaitement si tu dois transformer un fichier depuis un
shell plutôt que de faire la manip dans un programme en C/PHP/Python/whatever.
Il se trouve simplement qu'elle enchaîne deux regex au lieu d'une, comme je
l'ai expliqué dans ma réponse à son article. Vu que tu n'avais pas dit dans
quel contexte tu voulais utiliser une (ou plusieurs) regex, c'est pour ça que
j'ai donné plusieurs solutions.
-- Olivier Miakinen