![]() |
| Extraire des chiffres dans une chaine | |
| Didier | 2-Oct-2008/21:17:43+2:00 |
| Bonjour à vous, Je cherche un moyen simple pour extraire uniquement les chiffres dans une chaines ! par exemple : extraire : 12345 de 12DF34jr5 Merci d'avance, Didier | |
| Philippe | 3-Oct-2008/8:53:52+2:00 |
| Salut, Tout dépend de ce que tu entends par extraire : récupérer les chiffres ou ne garder que les lettres ? extraire: "12345 de 12DF34jr5" trim/with extraire "0123456789" == " de DFjr" ===Philippe | |
| Didec | 3-Oct-2008/9:44:34+2:00 |
parse is your friend, always !chaine: "12DF34jr5" ; chaine à filtrer que-chiffres: "" ; resultat chiffre: charset "0123456789" parse/all chaine [any [p: chiffre (append que-chiffres p/1) | skip]] probe que-chiffres | |
| Didec | 6-Oct-2008/12:10:07+2:00 |
| J'y reviens ! comme toujours en programmation, il y a plusieurs façon de faire les choses. Le choix va dépendre de son besoin principal : compréhension, élégance, vitesse... Voici trois versions différentes qui produisent le résultat demandé. Attention, parfois c'est la chaine source qui est modifiée, parfois pas ! Ici, je démontre la vitesse, pour l'élégance ou la compréhension, chacun jugera ! chaine: "12DF34jr5" ; chaine à filtres chiffre: charset "0123456789" pas-chiffre: complement charset "0123456789" t: now/time/precise loop 100000 [ chaine: copy "12DF34jr5" ; l'original est modifié, donc on copy remove-each p chaine [find pas-chiffre p] ] print ["remove-each :" now/time/precise - t] t: now/time/precise loop 100000 [ que-chiffres: copy "" ; resultat dans une autre chaine parse/all chaine [any [p: chiffre (append que-chiffres p/1) | skip]] ] print ["parse extrait :" now/time/precise - t] t: now/time/precise loop 100000 [ chaine: copy "12DF34jr5" ; l'original est modifié, donc on copy parse/all chaine [any [chiffre | end break | p: (remove p)]] ] print ["parse remove :" now/time/precise - t] | |
| guest2 | 6-Oct-2008/16:06:29+2:00 |
| La solution avec append semble être la plus lente. Mais en fait on peut largement l'optimiser et elle devient alors 2 fois plus rapide que les autres. t: now/time/precise loop 100000 [ que-chiffres: clear "" ; resultat dans une autre chaine parse/all chaine [any [copy p some chiffre (insert tail que-chiffres p) | some pas-chiffre]] ] print ["parse extrait :" now/time/precise - t] il y a 2 améliorations importantes par rapport au code de Didec. - Eviter les ma-variable: copy ""quand on peut reutiliser la même variable de travail dans une boucle. Préferer alors ma-variable: clear "". Ceci évite à Rebol de réallouer de la mémoire quand ce n'est pas nécessaire. - Le parseur a été modifié pour pouvoir traiter plusieurs caractères en même temps plutôt qu'un seul caractère à la fois. D'une façon générale, Plus la chaine ou le block à traiter en entrée est grand et plus faire des removes devient lent par rapport à des append. Mais c'est vrai que l'utilisation de remove permet souvent d'être plus concis à l'écriture du code. | |
| didier | 13-Oct-2008/22:25+2:00 |
| C'est parfait Merci | |
| guest3 | 14-Oct-2008/13:36:52+2:00 |
| intersect "612DF34jr5" "1234567890" | |
| Didec | 14-Oct-2008/16:04:06+2:00 |
Bonne idée, mais ça ne marche pas si un chiffre est en double ou plus !!>> intersect "612DF34jr5f6f2112fs011s2df111f20549897d4f" "1234567890" == "6123450987" | |
| Philippe | 14-Oct-2008/22:18:41+2:00 |
| Salut, D'ailleurs, c'est dommage qu'il n'y ait pas un équivalent de :
alpha: charset [#"A" - #"Z" #"a" - #"z"]
== make bitset! #{
0000000000000000FEFFFF07FEFFFF0700000000000000000000000000000000
}
avec une fonction intégrée à Rebol pour avoir quelque chose cela en string! :
liste-alpha: set-of-chars [#"A" - #"Z" #"a" - #"z"]
=={ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}
===Philippe | |
| Didec | 15-Oct-2008/10:14:16+2:00 |
C'est pas bien compliqué à faire. Inutile de le mettre en natif :set-of-chars: func [spec [block!] /local out f s generate] [ out: copy "" generate: func [b e /local sw] [ b: to-integer b e: to-integer e if b > e [sw: b b: e e: sw] for i b e 1 [insert tail out to-char i] ] parse spec [any [set f char! '- set s char! (generate f s) | set f char! (insert tail out f)]] out ] set-of-chars [#"A" - #"Z" #"a" - #"z"] | |
| DocKimbel | 15-Oct-2008/23:16:35+2:00 |
Y'a plus simple :set-of-chars: func [data [block!] /local out][
out: make string! 255
data: charset data
repeat c 255 [if find data c [append out to char! c]]
out
]
set-of-chars [#"A" - #"Z" #"a" - #"z"]
== {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}
| |
| Philippe | 16-Oct-2008/6:31:01+2:00 |
| Que j'aime cette douce émulation ! ===Philippe PS. Ce serait peut-être bien de mettre ces exemples sur la Library ? | |
| Didec | 16-Oct-2008/13:26:54+2:00 |
| Moi aussi j'aime cette émulation, c'est clair ! Je suis pas trop mauvais en Rebol, mais Doc est un Guru !! | |
|
Login required to Post. | |