Je n’arrive pas trouver la réponse à un petit problème concernant les
regexp (avec ruby 1.9.1). Mais comme je viens de découvrir le monde
merveilleux des regexp, j’imagine que la solution doit probablement
être toute bête. alors voila:
J’ai une ligne html qui ressembme à ça:
mai09
Dans mon appli Rails, je vais avoir besoin de récupérer la date.
Je repère ma date avec cette petite formule.
[a-z]{3,}.?\d{2}
Ca marche bien, sauf pour le mois “août”, à cause de l’accent… mes
essais ont tous fait plouf jusqu’ici.
Bizarrement, ça marche en tant que script ruby, mais sous rails, qui
me renvoit un méchant
“invalid character property name {L}: /^\p{L}{3,}.?/”
Etonnant non?! Là ça me dépasse. Si quelqu’un avait une idée a me
soumettre.
Pour info:
Ruby version 1.9.1 (x86_64-linux)
RubyGems version 1.3.6
Rack version 1.0
Rails version 2.3.5
Active Record version 2.3.5
Active Resource version 2.3.5
Action Mailer version 2.3.5
Active Support version 2.3.5
Globalement parser du html avec des regexp c’est pas l’idée du siècle
car dès que le html ne sera plus valide tu vas obtenir n’importe quoi
mais si tu peux faire confiance au html c’est good enough.
Ceci dit il y a plein de solution à ton problème, il suffit d’en
comprendre la nature:
depuis très longtemps les regExp ruby fonctionne avec l’utf8 en
1.8.2 il suffisait de $KCODE = ‘u’ et depuis c’est souvent par defaut.
[a-z] ne contient pas les caractères accentués, ni majuscule, juste
de a à z, \w en revanche signifie en gros caractères alphabétique au
sens large
[a-zû] fonctionne aussi
n’utilise pas encore les subtilité de ruby 1.9, sinon tu risques
d’entendre tes oreilles siffler, c’est encore trop tôt, 100% des vrais
prod sont en 1.8;x
Pour en revenir à ton problème de parser du html avec des regexp voilà
quelques solutions:
Générique:
/
(.*?)</th>/m
Spécifique:
/
([\w\d]*)</th>/m
Ultra spécifique:
/
(\w{3,}\d{2})</th>/m
Tu as juste à regarder dans $1 pour trouver le résultat
Globalement parser du html avec des regexp c’est pas l’idée du siècle
car dès que le html ne sera plus valide tu vas obtenir n’importe quoi
mais si tu peux faire confiance au html c’est good enough.
Oui, je sais bien, mais mon html n’est d’une part pas très bien formé
et d’autre part pas tellement susceptible de bouger. La forme des
données encore moins, pour l’instant je ne vois pas tellement d’autre
façon de faire.
prod sont en 1.8;x
Ah… suis passé en 1.9.1 parce que ma distrib a upgradé (archlinux).
J’aurais du figer la version.
Pour le coup j’ai recompilé la 1.8.7
/
(\w{3,}\d{2})</th>/m
Tu as juste à regarder dans $1 pour trouver le résultat
Je n’arrive pas trouver la réponse à un petit problème concernant les
regexp (avec ruby 1.9.1). Mais comme je viens de découvrir le monde
merveilleux des regexp, j’imagine que la solution doit probablement
être toute bête.
je rajoute +1 à la première remarque de Renaud - franchement:
n’utilise pas les regexp pour parser du HTML. Prend un hpricot ou un
nokogiri
Après puisque tu indiques que tu découvres les regexp, voilà quelques
remarques:
les regexp peuvent être très utiles et http://www.rubular.com pourra
t’aider quand tu t’en sers
mais on dit souvent: quand tu as un problème, et que tu penses aux
regexp pour le régler, et bien tu as deux problèmes: ton problème et
la regexp