Forum Clubic

[Résolu][JAVA] Pb Motifs pour regex - Ou comment réussir des patterns regex

J’ai besoin de chercher des informations dans une chaîne de caractères.
Je viens de découvrir que Java propose, depuis la version 1.4, un support des expressions régulières très proche de la syntaxe de perl. Chouette !

Seulement voilà, je n’arrive pas à matcher un pattern sur ma chaîne. Pour que ce soit plus clair, j’ai une chaîne du type

O:01G:02D:(;;;;;)(;;;;;)S:(;;;;;)(;;;;;)(;;;;;)

dans les parenthèses, entre chaque ‘;’, il peut y avoir n’importe quoi. Mes champs sont délimités par O:, G:, D: et S:, il ne peut pas y avoir d’espaces. Enfin, chaque champs peut-être dans le désordre (le O: après le G:, etc.). Je précise, toutes ces conditions sont indépendantes de ma volonté, je ne peux pas les modifier, ou en rajouter, ou en supprimer.

Sur cette chaîne, je souhaiterais récupérer chaque valeur des champs. Par exemple, pour le champ O:, je voudrais récupérer la valeur 01, pour le champs G: la valeur 02, pour les champs D: et S: le contenu dans les parenthèses, parenthèses incluses.

J’ai donc, pour un test, fait un petit pattern pour matcher la valeur de O: :

String str = "O:01G:02D:(;;;;;)(;;;;;)S:(;;;;;)(;;;;;)(;;;;;)";

if( Pattern.matches( "^(O:.*)?(G:.*)?(D:.*\\(.*\\))?(S:.*\\(.*\\))?$", str ) ) {
	Pattern p = Pattern.compile( "O:(.*?).:" );
	Matcher m = p.matcher( str );

	if( m.matches() )
  System.out.println( str.substring( m.start(), m.end() ) );
}

Avec le pattern O:(.*?).:, sur un testeur d’expressions régulière en ligne (voir ici), j’obtient les valeurs O:01G: et 01. Mais avec Java, je n’ai rien du tout.

Quelqu’un aurait une solution à m’apporter ? Ou s’y connait en expressions régulières ? Merci par avance ^^

Parce que matches match la chaîne entière contre le pattern

Essaye find

ah oui, effectivement, ca va mieux ^^
Bon déjà ca c’est bon, merci !

Toujours sur le même exemple, j’ai un second problème. Mon expression régulière O:(.*?).: me retourne le résultat O:01G:. Je ne m’y connais pas assez pour fabriquer un pattern qui me retournerais 01 seulement. De plus, les champs peuvent ne pas être présent (donc O: peut être tout seul dans la chaîne). J’ai essayé un pattern sans succès pour dire que .: peut être présent 1 fois ou pas du tout.

Enfin voilà, tout ca pour dire que je bloque là-dessus, et ca m’énérve un peu en fait :fou:

EDIT : Pour ceux que ca intéresse (pas grand monde, voir personne ^^), l’expression régulière que j’ai trouvé, et qui semble fonctionner pour trouver juste la l’élément O: et sa valeur est O:([^OGDS][^:])* Tout ca pour travailler correctement sur les schémas de Active Directory …

t’as la classe utilitaire Scanner aussi, qui te permet de faire un peu plus et un peu moins.