Forum Programmation.java [Java] Extraire informations d'une String

Posté par  .
Étiquettes : aucune
0
7
jan.
2006
Bonjour,
J'ai une String du genre : nom1(val1) ou nom2(val1,val2)
par exemple cette string peut valoir :
- random(1.5)
- degree(5.8,5.1)
- ...
Il faut que je sépare cette string en 2 ou 3 string suivant les cas :
- string1 = random ; string2 = 1.5
- string1 = degree ; string2 = 5.8 ; string3 = 5.1

Je ne comprend pas pourquoi ce code ne marche pas :

// compilation de l'expression reguliere
Pattern pattern1 = Pattern.compile("/(\\w+)(\\((\\d+)(,(\\d+))?\\))?/");
// création d’un moteur de recherche
Matcher matcher1 = pattern1.matcher(s1);
System.out.println(s1); => degree(2,0)
System.out.println(matcher1.groupCount()); => 5
System.out.println(matcher1.group(0)); => java.lang.IllegalStateException: No match available


Il trouve bien le bon nombre groupe, mais des que j'accede au 1er groupe j'ai une erreur.

Merci d'avances pour vos réponses.
  • # start ?

    Posté par  . Évalué à 1.

    Je vois que tu n'as pas fait de start()

    je suppose que pour l'utilisation tu dois faire un start(),

    et tant que find() retourne vrai tu continue. fin() passerai a la prochaine chaine qui correspont qu'il trouve. et le start pour lui dire de commencer a traiter.

    http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matc(...)

    non ?
  • # avant les regexps, comment faisait on ?

    Posté par  (site web personnel) . Évalué à 3.

    à la question "avant les regexps comment faisait on ?" la reponse tiens bien souvent quand on ne sait pas à un truc du genre "on ne faisait pas". sauf que les langages de programmations ont existé avant le langage meme des regexps.

    donc la technique super secrete pour ne pas parser avec des regexps est :

    - contains( CharSequence )
    - charAt( int )
    - indexOf( int, int )
    - lastIndexOf( int, int )
    - substring( int, int )
    - length()

    tu disposes aussi d'une classe pas mal utile java.util.StringTokenizer que tu peux dériver pour faire des tokenizer plus personnel :)
    • [^] # Re: avant les regexps, comment faisait on ?

      Posté par  . Évalué à 2.

      ouais je suis complétement d'accord !
      Des fois on passe plus de temps à mettre au point des regexps que
      de faire un petit peu de logique dans son programme ! Surtout avec des
      syntaxes aussi simples... Je t'invite aussi à te tourner vers ses méthodes !

      a+
      Xavier
  • # Parsing

    Posté par  (site web personnel) . Évalué à 1.

    Salut,

    Je ne sais pas à quel point ta syntaxe est complexe, mais si tu veux écrire un parser un tant soit peu lisible pour une grammaire conséquente, peut-être devrais-tu regarder du côté de générateurs de parsers. Celui qui me vient en tête en Java est ANTLR. Je l'avais utilisé il y a quelques années, et même si cela peut prendre un peu de temps à découvrir, le jeu en vaut largement la chandelle : ça évite de réinventer la roue (et les bugs qui vont avec).

    http://www.antlr.org/doc/getting-started.html
  • # [Java] Extraire informations d'une String

    Posté par  . Évalué à 2.

    Tu dois enlever les 2 /
    De plus, je pense que tu dois remplacer le premier ? par un +. Sinon, ton lexer ne parsera que des expressions de maximum 2 paramètres.
    Voici l'expression que je te conseille:


    Pattern pt=Pattern.compile("(\\w+)(\\((\\d+)(,(\\d+))+\\))?");


    J'espère que cela t'aide
  • # the pépé touch

    Posté par  . Évalué à 1.

    Hello, il faut faire gaffe aux caractères "." qui ne passent pas dans "\d+".

    l'expression régulière à mon avis serait plutôt du style:

    (\w+)\(((\d+(\.\d+)?)(,(\d+(\.\d+)?))?)\)

    berk :)

    si tu utilise cette expression tu vas te retrouver avec les groupes de capture suivants:

    1 = random
    2 = 1.5
    3 = 1.5
    4 = .5
    5 =
    6 =
    7 =


    1 = degree
    2 = 5.8,5.1
    3 = 5.8
    4 = .8
    5 = ,5.1
    6 = 5.1
    7 = .1


    voilà, y'a plus qu'à récupérer ce qu'il te faut et l'utiliser comme tu veux :)

    PS: un petit tool qui peut être utilie, pour tester les expressions régulières.

    A+

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.