IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[ocaml] Expressions régulières


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut [ocaml] Expressions régulières
    Bonjour,

    est-ce qu'on peut avoir des expressions régulières avec "shortest match" avec Str?
    Sinon, quel moyen pourriez vous conseiller pour faire ca?

    Merci.
    Rosali

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bonjour,

    http://caml.inria.fr/pub/docs/manual...manual037.html
    Tu dois pouvoir arriver à tes fins

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Par défaut
    RosaliRosali > je ne sais pas trop ce que tu veux faire. J'ai déjà tripoté l'option "greedy" en PHP mais c'était toujours dans des cas douteux.

    Tu as un exemple de ce que tu veux, où le comportement de Str n'est pas celui que tu attends ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Ben, oui, je connais ca. Je voulais simplement savoir si qqn sais si "shortest match" est supporté. C'est pas indiqué dans le doc.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tiré de http://courses.softlab.ntua.gr/compi...x-tutorial.pdf
    Though the "shortest match" principle is not used so frequently, ocamllex supports it. If you want to select the
    shortest prefix of the input, use shortest keyword instead of the parse keyword. The "first match" principle
    holds still with the "shortest match" principle.
    Mais bon, c'est lancer un piano sur une mouche

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    J'ai un string, qui en fait est composé des couples d'entiers :
    (3,4)(6,7)(34,23)(233,2)
    Je voudrais lire ca d'un fichier et mettre dans une liste : (int*int) list

    Je voulais faire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let read s =
      let regex = Str.regexp "(\(.+\),\(.+\))" in
      let rec aux s a =
        try
          let j = Str.search_forward regex 0 s in
          let x = int_of_string (Str.matched_group 1 s) in 
          let y = int_of_string (Str.matched_group 2 s) in
          let k = Str.group_end 2 in
          let sub = String.sub s k ((String.length s)-k) in
    	aux sub a@[(x,y)]
        with Not_found -> a
      in aux s []
    ;;
    C'est la première fois que j'utilise des regexps avec caml, donc je ne suis pas sûre si cela s'utilise comme ca.
    En tous cas, matched_group 1 va donner
    3,4)(6,7)(34,23)(233
    au lieu de
    3

    Bon, là, je me rends compte que je pourrais utiliser [0-9]+ au lieu de .+
    Peut-être ...

  7. #7
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par RosaliRosali Voir le message
    Bon, là, je me rends compte que je pourrais utiliser [0-9]+ au lieu de .+
    Peut-être ...
    Tu as trouvé la solution

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Voilà, cela fait ce que je voulais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let read s =
      let regex = Str.regexp "(\([0-9]+\),\([0-9]+\))" in
      let rec aux s a =
        try
          let j = Str.search_forward regex s 0 in
          let x = int_of_string (Str.matched_group 1 s) in 
          let y = int_of_string (Str.matched_group 2 s) in
          let k = Str.group_end 2 in
          let sub = String.sub s k ((String.length s)-k) in
    	aux sub (a@[(x,y)])
        with Not_found -> a
      in aux s []
    ;;
    Quand même, ca me donne des warnings :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Characters 44-46:
        let regex = Str.regexp "(\([0-9]+\),\([0-9]+\))" in
                                 ^^
    Warning X: illegal backslash escape in string.
    Characters 52-54:
        let regex = Str.regexp "(\([0-9]+\),\([0-9]+\))" in
                                         ^^
    Warning X: illegal backslash escape in string.
    Characters 55-57:
        let regex = Str.regexp "(\([0-9]+\),\([0-9]+\))" in
                                            ^^
    Warning X: illegal backslash escape in string.
    Characters 63-65:
        let regex = Str.regexp "(\([0-9]+\),\([0-9]+\))" in
                                                    ^^
    Warning X: illegal backslash escape in string.
                        Characters 109-110:
            let j = Str.search_forward regex s 0 in
                ^
    Warning Y: unused variable j.
    Je comprends que j n'est pas utilisé. (Mais comment est-ce que je pourrais faire autrement?)
    Et les autres warnings...?! C'est simplement la syntaxe de regexp... Je ne comprends pas.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Remplace let j par let _, ça devrait arranger le soucis pour j.
    Essaye de doubler les antislash pour voir si ça arrange le warning (i.e remplace \ par \\).

Discussions similaires

  1. [OCaml] Expressions régulières
    Par Le Mérovingien dans le forum Caml
    Réponses: 8
    Dernier message: 18/03/2007, 15h43
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 19h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 11h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 19h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo