Regexp et utf-8

Bonjour,

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.

Une idée?

Bonsoir,

Le 21 février 2010 23:56, rmb [email protected] a écrit :

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.

Une idée
?

Ruby 1.9 commence à introduire des syntaxes pour gérer spécifiquement
les
propriétés utf8. Ce qui suit marche bien en 1.9.1 mais non en 1.8.7 :

“août”.match(/^\p{L}+$/)

Dans ton cas il faudrait donc remplacer [a-z] par p{L}, et voir si ça te
renvoie ce qu’il faut.
Une référence ici : Regular Expressions Reference - Unicode Syntax

Cdt,

JB

Ca marche effectivement.

Très intéressant, merci!

On 22 fév, 00:43, Jean-Baptiste B. [email protected]

Bon fausse joie :frowning:

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

On 22 fév, 00:43, Jean-Baptiste B. [email protected]

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:

  1. 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.
  2. [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
  3. [a-zû] fonctionne aussi
  4. 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

Effectivement ça marche enfin.
Merci!

Hello,

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 :slight_smile:

Après puisque tu indiques que tu découvres les regexp, voilà quelques
remarques:

en espérant t’avoir été utile!

– Thibaut