Regex ruby

Tant qu’à faire du off-topic (quoique) - jetez un oeil à la série the
IT Crowd:

http://video.google.com/videoplay?docid=4174391869357140840

Deux geeks se chargent du support informatique d’une boite - british
et très drôle.

Thibaut

http://evolvingworker.com

Oui, avec une regexp plus compliquée, et à condition que tu aies un
critère
pour distinguer un espace à remplacer d’un espace à conserver tel quel.


Michel B.

J’vois que mon topic est parti un peu dans les séries TV, perso j’aime
bien Dexter et The Shield…

Et pour en revenir au topic, j’aimerais connaitre votre avis sur ma
problématique, admettons une chaine :
colonne1 colonne2 colonne3 colonne4 col lonne5

Est il possible de remplacer les espaces par un point-virgule mais de
laisser cet espace en col et lonne5 :
colonne1;colonne2;colonne3;colonne4;col lonne5

le “col lonne5” peut tres bien etre en début, milieu ou fin de
chaine…

j’ai essayé mais je ne pense pas que ce soit possible…

Merci par avance…

On 14 oct, 09:42, “Michel B.” [email protected]

En fait, en pratique c’est la date et l’heure xx/xx/xxxx xx:xx:xx…

Si tu veux avoir des réponses bien adaptées, il serait souhaitable que
tu donnes des données réelles ou proche des vraies car le problème
devient ici tout à fait différent, et les solutions aussi…

Connais-tu rubular (http://www.rubular.com/) ? Tu pourrais t’en servir
pour tester tes patterns et trouver plus facilement la réponse à tes
questions.

cheers

Thibaut

http://evolvingworker.com

Un pattern comme exemple stp ? et qu’entends-tu par un crtière pour
distinguer un espace à remplacer d’un espace a conserver tel quel ?
En fait, en pratique c’est la date et l’heure xx/xx/xxxx xx:xx:xx…

On 14 oct, 14:42, “Michel B.” [email protected]

Tu peux aussi lire Beginning Regular
Expressionshttp://www.amazon.fr/exec/obidos/ASIN/0764574892/lobldo-21ou
Mastering
Regular Expressions </>, c’est selon.
– Thibaut

Difficile de te faire un exemple tant que je ne sais pas ce que tu
recherches. Mettons que tu aies une liste QUE de date/heure TOUTES sous
le
format :
xx/xx/xxxx xx:xx:xx

Alors tu pourrais faire :
ta_chaine.gsub(/((?:[0-9]{2}:){2}[0-9]{2})\s+((?:[0-9]{2}/){2}[0-9]{4})/g,
‘$1,$2;’)

Pour te la décomposer avec ça, tu cherches tout ce qui est comme ça :
xx:xx:xx xx/xx/xxxx
(où “x” est un nombre de 0-9 et " " un certain nombre d’espaces
,tabulations
et saut de ligne compris)
ET tu remplace par :
le premier groupe capturé (xx:xx:xx) suivi d’un “;” suivi du deuxième
groupe
capturé (xx/xx/xxxx)

Maintenant, si tu veux faire des étincelles avec les regexp, je te
recommande la lecture de cet excellent site :

Une fois que tu aura lu ça, tu verra ça ira beaucoup mieux, et tu te
mettras
à faire plein de trucs de oufs en regexp…


Michel B.

Tu peux aussi lire Beginning Regular Expressions (http://tinyurl.com/
3nq2xf) ou Mastering Regular Expressions (http://tinyurl.com/42rk88),
c’est selon.

– Thibaut

Oui, mais bon en fait faut pas trop rêver quand même les expressions rationnelles ont aussi une limite</phrase du
jour>. Si ta “col lonne5” peut contenir tout et n’importe quoi (\s
compris) et que les autres colonnes ont systématiquement \s comme
séparateur, alors il n’y a pas de solution générique. En fait avant de
lire tous les livres qui ont été écrits sur les expressions
rationnelles ou de t’arracher les cheveux sur rubular, la première
question serait de savoir d’où proviennent ces données que tu cherches
à reformater. En effet, elles n’ont pas l’air très “belles”. Mais cela
peut-il changer ?

Good luck !

Greg

Le 14 octobre 2008 15:26, Thibaut Barrère [email protected] a
écrit :

Le 14 octobre 2008 15:11, Michel B. a écrit :

Difficile de te faire un exemple tant que je ne sais pas ce que tu
recherches. Mettons que tu aies une liste QUE de date/heure TOUTES sous le
format :
xx/xx/xxxx xx:xx:xx

Alors tu pourrais faire :
ta_chaine.gsub(/((?:[0-9]{2}:){2}[0-9]{2})\s+((?:[0-9]{2}/){2}[0-9]{4})/g,
‘$1,$2;’)

avec \d à la place de [0-9], ce serait plus lisible.

Sinon c’est quoi l’option g ?

‘$1,$2;’ → ‘\1,\2;’

– Jean-François.


Les 50 ans du Lisp : http://www.lisp50.org
http://twitter.com/underflow_

Tu peux aussi lire Beginning Regular Expressions
http://tinyurl.com/3nq2xf
ou Mastering Regular Expressions http://tinyurl.com/42rk88 , c’est
selon.

– Thibaut

Le 14 octobre 2008 14:36, Saigon a écrit :

J’vois que mon topic est parti un peu dans les séries TV, perso j’aime
bien Dexter et The Shield…

Ouais c’est du highjack threading, on aurait dû changer de Subject.
Mes excuses.

– Jean-François.


Les 50 ans du Lisp : http://www.lisp50.org
http://twitter.com/underflow_

Le 14 octobre 2008 15:51, Gregoire LEJEUNE a écrit :

Oui, mais bon en fait faut pas trop rêver quand même les expressions rationnelles ont aussi une limite</phrase du
jour>. Si ta “col lonne5” peut contenir tout et n’importe quoi (\s
compris) et que les autres colonnes ont systématiquement \s comme
séparateur, alors il n’y a pas de solution générique.

ça dépend, si on sait que ça arrive toujours à la 5e colonne (ce n’est
pas le cas ici), on aurait pu faire str.split(/\s+/, 5).join ‘;’

-- Jean-François.


Les 50 ans du Lisp : http://www.lisp50.org
http://twitter.com/underflow_

Oui, en effet, et si en plus on sait que dans la “col lonne5” il y a
toujours le mot “col lonne5” ça le fait aussi. Où si ce n’est pas
toujours “col lonne5” mais toujours un mot genre “quelquechosel
lautrechose” ça peut le faire (bien que cela ne soit pas evident sauf
si c’est TOUJOURS le cas. Il y a aussi la possibilité que l’espace (ou
tout autre \s) ne soit que dans la “col lonne5”, mais qu’il soit
systématique… Bref plein d’exceptions qui peuvent faire que cela
fonctionne… Mais bon !

Greg

Le 14 octobre 2008 16:02, Jean-François Trân [email protected] a écrit :

Le 14 octobre 2008 18:33, Gregoire a écrit :

Oui, en effet, et si en plus on sait que dans la “col lonne5” il y a
toujours le mot “col lonne5” ça le fait aussi. Où si ce n’est pas
toujours “col lonne5” mais toujours un mot genre “quelquechosel
lautrechose” ça peut le faire (bien que cela ne soit pas evident sauf
si c’est TOUJOURS le cas. Il y a aussi la possibilité que l’espace (ou
tout autre \s) ne soit que dans la “col lonne5”, mais qu’il soit
systématique… Bref plein d’exceptions qui peuvent faire que cela
fonctionne… Mais bon !

Et “mercredi 22 octobre” ça matche ou pas ?

-- Jean-François.


Les 50 ans du Lisp : http://www.lisp50.org
http://twitter.com/underflow_

Jean-François Trân a écrit :

avec \d à la place de [0-9], ce serait plus lisible.

Sinon c’est quoi l’option g ?

‘$1,$2;’ --> ‘\1,\2;’

РJean-Fran̤ois.

@Michel: Je ne sais pas si le “:” doit être échappé ni si la regex est
très optimale, mais je crois que ce n’est pas la discussion :wink:

@Jean-François: Pour le modifier “g”, c’est “global” en Perl et autres
langages PCRE, et ça dit au moteur de regex de ne pas “s’arrêter” au
premier match qu’il trouve. En Ruby je crois que c’est le comportement
par défaut.

@Thibaut: Pour le bouquin “Mastering regular expressions”, j’approuve,
c’est un excellent livre, très complet et en plus agréable à lire pour
ceux que les regex intéressent. Il existe en français également, mais
vus les déboires d’Oreilly Fr il est peut être difficile à trouver…


Jean-Baptiste

Le 14 octobre 2008 19:29, Jean-Baptiste a écrit :

@Jean-François: Pour le modifier “g”, c’est “global” en Perl
et autres langages PCRE, et ça dit au moteur de regex de ne
pas “s’arrêter” au premier match qu’il trouve. En Ruby je crois
que c’est le comportement par défaut.

Ce n’est pas une question de défaut ou pas. Tu utilises #gsub
ou #sub selon. Moi je parle d’une option g pour les objets Regexp.
Pour moi, ça n’existe pas, à moins qu’on me prouve le contraire.

$ irb

/a/g
SyntaxError: compile error
(irb):1: unknown regexp option - g
from (irb):1

Il y a les options i m x (ignorecase, extended, multiline) et
pour 1.8, e n s u pour les histoires d’encodage, mais pas de g.

– Jean-François.


Les 50 ans du Lisp : http://www.lisp50.org

http://twitter.com/underflow_

Jean-François Trân a écrit :

Ce n’est pas une question de défaut ou pas. Tu utilises #gsub
ou #sub selon. Moi je parle d’une option g pour les objets Regexp.
Pour moi, ça n’existe pas, à moins qu’on me prouve le contraire.

Yep, je m’exprimais pour les autres langages que je connais, c’est
sûrement plus juste de dire que “ça n’existe pas” … en Ruby.
Pour être honnête, je me doutais que le “g” de “gsub” avait quelque
chose à voir, mais je ne connaissais même pas “sub” tellement ça m’a
servi souvent.


Jean-Baptiste

Oui, bon, y’a pas d’option “g”, mea culpa c’est parce que je fais
beaucoup
de regexp JavaScript ces temps-ci. Ok aussi pour le \d.

De toute façon cette regexp je l’ai vite pondue pour lui donner un
exemple
rapide et pour lui donner envie d’en savoir plus sur les regexp plutôt
que
de toujours demander à qui sait les faire de faire le boulot à sa place
et
d’en rester dépendant. Et puis ça ne fait de mal à personne d’essayer et
bidouiller autour en utilisant son cerveau plutôt que de se contenter
d’un
copier-coller.


Michel B.