Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

cherche Regexp ...

8 réponses
Avatar
unbewusst.sein
le but de la manip:

convertir :

function Machin(){
...
corps de la onction
...
}

en :

function Machin(){...} //là les "..." remplacent ce qu'il y avait dans
le corps de la fonction.

j'ai essayé des trucs comme :

var fonction=setToRed.toString();// "setRed" est une function

fonction=fonction.replace(/^([^\{]*).*([^\}]*)$/,
RegExp.$1+'{...}'+RegExp.$2);

mais ça me donne l'entiéreté de la fonction, avec son corps...
--
Une Bévue

8 réponses

Avatar
Olivier Miakinen
le but de la manip:

convertir :

function Machin(){
...
corps de la onction
...
}

en :

function Machin(){...} //là les "..." remplacent ce qu'il y avait dans
le corps de la fonction.


Donc tu veux garder tout jusqu'à l'accolade ouvrante, et remplacer tout
le reste par "...}".

j'ai essayé des trucs comme :

var fonction=setToRed.toString();// "setRed" est une function

fonction=fonction.replace(/^([^{]*).*([^}]*)$/,
RegExp.$1+'{...}'+RegExp.$2);


Voyons voir.

^ = ancré au début

([^{]*) = un nombre quelconque de fois ce qui n'est pas un ou un {
(ou peut-être seulement un { mais j'ai la flemme d'aller vérifier)

.* = un nombre quelconque de fois ce qui n'est pas un saut de ligne

([^}]*) = un nombre quelconque de fois ce qui n'est pas un ou un }
(même remarque)

$ = ancré à la fin

mais ça me donne l'entiéreté de la fonction, avec son corps...


Oui, parce que le premier saut de ligne se trouvait juste après la
première accolade, donc le .* était vide. Note que dans le cas contraire
c'est RegExp.$2 qui aurait été vide.


Le problème c'est que l'option s qui autorise le caractère . à remplacer
un saut de ligne n'existe pas dans JavaScript (c'est dans PCRE). Ceci
devrait fonctionner :

fonction = fonction.replace(/^([^{]*)(.|n)*([^}]*)$/,
RegExp.$1+'{...}'+RegExp.$3);


Mais il y a plus simple, par exemple :

fonction = fonction.replace(/{(.|n)*/, '{...}');

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Donc tu veux garder tout jusqu'à l'accolade ouvrante, et remplacer tout
le reste par "...}".



exactement, c'est pour un "toString()" sur des objets quelconques...
ça n'a d'intérêt que pour la mise au point...

j'ai essayé des trucs comme :

var fonction=setToRed.toString();// "setRed" est une function

fonction=fonction.replace(/^([^{]*).*([^}]*)$/,
RegExp.$1+'{...}'+RegExp.$2);


Voyons voir.

^ = ancré au début

([^{]*) = un nombre quelconque de fois ce qui n'est pas un ou un {
(ou peut-être seulement un { mais j'ai la flemme d'aller vérifier)



c'est ce que j'ai pensé le était là pour "escaper" le { qui est un
caractère spécial en Regexp.


mais ça me donne l'entiéreté de la fonction, avec son corps...


Oui, parce que le premier saut de ligne se trouvait juste après la
première accolade, donc le .* était vide. Note que dans le cas contraire
c'est RegExp.$2 qui aurait été vide.


Le problème c'est que l'option s qui autorise le caractère . à remplacer
un saut de ligne n'existe pas dans JavaScript (c'est dans PCRE). Ceci
devrait fonctionner :



ouais exact, j'ai recherché, vainement, ce modifieur.

fonction = fonction.replace(/^([^{]*)(.|n)*([^}]*)$/,
RegExp.$1+'{...}'+RegExp.$3);


Mais il y a plus simple, par exemple :

fonction = fonction.replace(/{(.|n)*/, '{...}');


oui, merci beaucoup, ça roule super...

--
Une Bévue


Avatar
unbewusst.sein
Une Bévue wrote:


oui, merci beaucoup, ça roule super...


Euh, un "petit bémol" :
ma function est exactement écrite comme ça :
function setToRed(element){
element.style.backgroundColor='red';
}

avec fonction = fonction.replace(/{(.|n)*/, '{...}');, ça me retourne :
function setToRed(element)
{...}

donc avec un n entre (element) et {...}, j'aurais préféré :
function setToRed(element) {...} (même ligne)

je ne pige pas pourquoi (c'est surtout pour ma comprenotte) le n
derrière l'acolade ouvrante {.

j'ai essayé en escapant ({) :
fonction = fonction.replace(/{(.|n)*/, '{...}');

ça donne exactement le même résultat curieux pour moi...
--
Une Bévue

Avatar
Olivier Miakinen
Une Bévue wrote:


oui, merci beaucoup, ça roule super...


Euh, un "petit bémol" :
ma function est exactement écrite comme ça :
function setToRed(element){
element.style.backgroundColor='red';
}

avec fonction = fonction.replace(/{(.|n)*/, '{...}');, ça me retourne :
function setToRed(element)
{...}


As-tu regardé à quoi ressemble fonction après le toString() et avant le
replace() ? Il est probable que l'accolade est à la ligne suivante,
présentation la plus fréquente pour les fonctions définies sur plusieurs
lignes.

j'ai essayé en escapant ({) :


Pfff... c'est exactement comme de rajouter un dans la classe de
caractères : comme tu ne sais pas ce que tu fais, tu es peut-être en
train de rajouter un bug car dans certains langages le n'est pas
supprimé quand il est inutile. Et surtout cela obscurcit le code.


fonction = fonction.replace(/{(.|n)*/, '{...}');

ça donne exactement le même résultat curieux pour moi...


Ce qui est sûr c'est que ça ne pouvait pas arranger les choses, juste
les dégrader (tu aurais retrouvé la fonction complète).

Ayant compris qu'il y a un saut de ligne tu peux faire :
fonction = fonction.replace(/n(.|n)*/, '{...}');


Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


As-tu regardé à quoi ressemble fonction après le toString() et avant le
replace() ? Il est probable que l'accolade est à la ligne suivante,
présentation la plus fréquente pour les fonctions définies sur plusieurs
lignes.



Ah ZUT ! effectivement....
mea culpa ;-)

le toString() me sort cette forme :
function setToRed(element)
{
element.style.backgroundColor = "red";
}

d'où le n...

j'ai essayé en escapant ({) :


Pfff... c'est exactement comme de rajouter un dans la classe de
caractères : comme tu ne sais pas ce que tu fais, tu es peut-être en
train de rajouter un bug car dans certains langages le n'est pas
supprimé quand il est inutile. Et surtout cela obscurcit le code.


euh c'est ce que j'avais retenu "{" est un métacaractère non ?



fonction = fonction.replace(/{(.|n)*/, '{...}');

ça donne exactement le même résultat curieux pour moi...


Ce qui est sûr c'est que ça ne pouvait pas arranger les choses, juste
les dégrader (tu aurais retrouvé la fonction complète).

Ayant compris qu'il y a un saut de ligne tu peux faire :
fonction = fonction.replace(/n(.|n)*/, '{...}');


OK, ça roule
--
Une Bévue


Avatar
Olivier Miakinen

"{" est un métacaractère non ?


Non. En tout cas pas tout seul, et encore moins dans une classe de
caractères. Par ailleurs, il n'y a aucune équivalence entre « être un
métacaractère » et « changer de sens quand on le précède de ». Cf. le
caractère n, par exemple ; dirais-tu que n est un métacaractère ?

Mais surtout, si tu rajoutes un devant un caractère qui n'en a pas
besoin, parfois ça supprime le sans rien dire et parfois ça le laisse,
selon le langage utilisé. Or, comme tu n'as pas l'air de vouloir lire
les docs avant de faire quelque chose, tu vas un jour te retrouver dans
un cas où ce qui fonctionnait en XXX¹ ne fonctionnera plus en YYY, et
tu viendras râler dans le groupe correspondant parce que ce n'est pas
logique.

¹ Remplacer XXX et YYY par des langages au hasard : JavaScript, PHP, C,
Perl, Python, Java, etc.

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Non. En tout cas pas tout seul, et encore moins dans une classe de
caractères. Par ailleurs, il n'y a aucune équivalence entre « être un
métacaractère » et « changer de sens quand on le précède de ». Cf. le
caractère n, par exemple ; dirais-tu que n est un métacaractère ?


non, pour moi, c'est juste un moyen de représenter un caractère "non
imprimable".

Mais surtout, si tu rajoutes un devant un caractère qui n'en a pas
besoin, parfois ça supprime le sans rien dire et parfois ça le laisse,
selon le langage utilisé.


je n'ai pas rencontré ce pb, si mon souvenir est bon, en java et en
ruby.

Or, comme tu n'as pas l'air de vouloir lire
les docs avant de faire quelque chose,


amha, on ne se réfère à la doc que quand il y a un pb, il faut se poser
des questions, avoir rencontré un problème, pour aller lire une doc,
plutôt mal faite en ce qui concerne le "web", bien souvent on (je)
fonctionne par analogie d'un langage à un autre.

j'ai cherché mais je n'ai pas trouvé cette info précise ni dans le
"Ecma-262.pdf" ni dans le "CoreReferenceJS15". je chercherai ailleurs
sur le net.

soit dit en passant je doute que Ecma-262.pdf soit une docum faite pour
l'utilisateur de js, c'est plutôt une spec écrite pour ceux, sans doute
très peu nombreux, qui implémentent js dans les naviagteurs.

tu vas un jour te retrouver dans
un cas où ce qui fonctionnait en XXX? ne fonctionnera plus en YYY, et
tu viendras râler dans le groupe correspondant parce que ce n'est pas
logique.


je sais bien que tous les regex sont -- peu ou prou -- des dialectes, à
mon grand regret.

je ne prend pas des regex toutes faites en prog en xxx vers un autre en
yyy, comme je ne me sent pas sûr en regexp je teste.


--
Une Bévue

Avatar
Olivier Miakinen

amha, on ne se réfère à la doc que quand il y a un pb, il faut se poser
des questions, avoir rencontré un problème, pour aller lire une doc,
plutôt mal faite en ce qui concerne le "web", bien souvent on (je)
fonctionne par analogie d'un langage à un autre.


Oui, je vois que nos deux approches de la programmation sont très
différentes. Personnellement je préfère lire la doc avant et avoir
un code qui marche du premier coup, plutôt que de passer du temps
après coup pour débuguer. Aussi, lorsque je dois débuguer le code
de quelqu'un d'autre, je le fais le plus possible en lisant le code
(donc sans l'exécuter) au lieu de procéder par essais et erreurs(¹).

[...]

soit dit en passant je doute que Ecma-262.pdf soit une docum faite pour
l'utilisateur de js, c'est plutôt une spec écrite pour ceux, sans doute
très peu nombreux, qui implémentent js dans les naviagteurs.


C'est vrai, mais c'est la seule que j'aie trouvé qui réponde sans ambi-
guïté à des questions telles que « est-ce que le flag s est autorisé
dans les RegExp » ?

[...] comme je ne me sent pas sûr en regexp je teste.


(¹) C.Q.F.D.