fonction équivalente au 'split' de perl? [pb regexp]

fonction équivalente au 'split' de perl? [pb regexp] - Java - Programmation

Marsh Posté le 30-04-2003 à 09:53:24    

Salut tout le monde!
 
j'aurais voulu savoir si en java, il existe une fonction équivalente au split de Perl (qui je le rapelle, permet de couper une chaine de charactère selon un motif et récupère le résultat dans un tableau).
ceci, parceque je dois ajouter des données au milieu d'un fichier qui a une structure bien définie. J'ai regardé du côté des regexp java, mais je vois pas de moyen aussi simple que split.
 
une idée??


Message édité par arghbis le 30-04-2003 à 14:40:03
Reply

Marsh Posté le 30-04-2003 à 09:53:24   

Reply

Marsh Posté le 30-04-2003 à 10:01:56    

désolé, j'ai rien dit!!
 
j'ai fait un  [:sh@rdar] , mais j'avais pas vu la bonne fonction!!
 
c chouette, elle existe, et s'appelle "split", dans la classe java.util.regex.pattern!
 
merci tout seul!  [:the time]

Reply

Marsh Posté le 30-04-2003 à 10:06:37    

Celle de la classe String doit être plus simple à utiliser.

Reply

Marsh Posté le 30-04-2003 à 10:13:22    

sinon, java.util.StringTokenizer

Reply

Marsh Posté le 30-04-2003 à 10:23:26    

ouapi, bon ben j'ai utilisé celle de la classe Sring (vu que c'en est un)!
 
ça m'apprendra à mieux lire avant de poster!!  :ange:

Reply

Marsh Posté le 30-04-2003 à 11:49:08    

comprends pas un truc : le pattern, on le défini comment??
si je mets Pattern.compile("aa*\d+\w?" )
il croit que * c vraiment le caractère *, \n il comprends pas, etc...
 
comment qu'on fait hein???

Reply

Marsh Posté le 30-04-2003 à 11:51:57    

arghbis a écrit :

comprends pas un truc : le pattern, on le défini comment??
si je mets Pattern.compile("aa*\d+\w?" )
il croit que * c vraiment le caractère *, \n il comprends pas, etc...
 
comment qu'on fait hein???


 
C une chaine de caractères ton pattern, et on fait quoi dans les chaines de caractères en Java, pour mettre de anti-slash ? On les double...  
Pattern.compile("aa*\\d+\\w?" )

Reply

Marsh Posté le 30-04-2003 à 12:43:08    

ouai, mais alors là, c qd même bizarre! comment fait-il pour faire la diférence entre "je cherche la chaine \n" et "je cherche un retour charriot"??

Reply

Marsh Posté le 30-04-2003 à 13:05:27    

arghbis a écrit :

ouai, mais alors là, c qd même bizarre! comment fait-il pour faire la diférence entre "je cherche la chaine \n" et "je cherche un retour charriot"??


Passke "la chaîne \n" c'est "\\n" et "retour chariot" c'est "\n" [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 30-04-2003 à 14:39:36    

bon ben comprends pas!
pourquoi il accepte pas ça :

Code :
  1. String pat = "(property  0 string \"viewLabel\"\s*\n(default \"\" \"\" )";
  2. String [] hrefBuff = aTulipFileString.split(pat);


 
il me dit :
Invalid character in escape sequence.
   (property  0 string "viewLabel" String pat = "(property  0 string \"viewLabel\"\s*\n(default \"\" \"\" )";
 
j'en rajoute une couche : les parenthèses que l'on utilise dans les regexp pour récupérer les match String, comment fait il la différence avec des parenthèses en tant que caractère?
 
Ps: je remarque un truc : la doc java est pas mal, il y a des exemples, mais la plupart du temps ils sont triviaux!


Message édité par arghbis le 30-04-2003 à 14:43:36
Reply

Marsh Posté le 30-04-2003 à 14:39:36   

Reply

Marsh Posté le 30-04-2003 à 14:42:13    

arghbis a écrit :

bon ben comprends pas!
pourquoi il accepte pas ça :

Code :
  1. String pat = "(property  0 string \"viewLabel\"\s*\n(default \"\" \"\" )";
  2. String [] hrefBuff = aTulipFileString.split(pat);


 
il me dit :
Invalid character in escape sequence.
   (property  0 string "viewLabel" String pat = "(property  0 string \"viewLabel\"\s*\n(default \"\" \"\" )";


 
s c'est un caractère d'échappement ? '\s' ça existe !? j'crois pas moi !  :o

Reply

Marsh Posté le 30-04-2003 à 14:44:42    

ben moi je crois bien!
 Predefined character classes
. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]
 
cf  [:sh@rdar]

Reply

Marsh Posté le 30-04-2003 à 14:46:03    

arghbis a écrit :

ben moi je crois bien!
 Predefined character classes
. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]
 
cf  [:sh@rdar]  


 
Non. Il faut faire la différence entre caractère d'échappement à l'intérieur d'une String Java et caractère d'échappement à l'intérieur d'une regexp. Ici, tu vas devoir écrire \\s


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 30-04-2003 à 14:48:26    

ben oui mais non!

Code :
  1. String pat = "(property  0 string \"viewLabel\"\\s*\\n(default \"\" \"\" )";


 
marche pas non plus!
 
en plus, je trouve que des exemples simples sur le net!!
personne utilise les regexp en java avec ce genre de choses?? j'y crois pas qd même!

Reply

Marsh Posté le 30-04-2003 à 14:49:03    

arghbis a écrit :

ben moi je crois bien!
 Predefined character classes
. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]
 
cf  [:sh@rdar]  


 
Mais tu confonds les patterns et les séquences d'échappement.
Essaye de faire ça :

Code :
  1. String monPattern = "(property  0 string \"viewLabel\"\\s*\n(default \"\" \"\" )";
  2. System.out


Tu comprendra peut être mieux... :heink:

Reply

Marsh Posté le 30-04-2003 à 15:02:45    

t'inquiètes pas, je comprends bien les échappements et patterns, c pas ça mon prob! mon prob est qu'il y a une ambiguité :
 
si tu recherche un parenthèse dans une chaine, et que tu veux capturer  ce qu'il y a dedans, genre "(chaine)' et je veux récupérer (chaine), je fais koi comme pattern??
\\((chaine)\\) ou ((chaine)) ??
 
et enfin dernier emmerdement en date, la fonction split (String regex) de la classe String, ben elle veut rien savoir! y me dit qu'il la trouve pas cet andouille de compilateur! (ennervement inside, désolé!)
 
mais je vous remercie tous de votre aide!  [:spikler]

Reply

Marsh Posté le 30-04-2003 à 15:08:01    

arghbis a écrit :

t'inquiètes pas, je comprends bien les échappements et patterns, c pas ça mon prob! mon prob est qu'il y a une ambiguité :
 
si tu recherche un parenthèse dans une chaine, et que tu veux capturer  ce qu'il y a dedans, genre "(chaine)' et je veux récupérer (chaine), je fais koi comme pattern??
\\((chaine)\\) ou ((chaine)) ??


Méthode simple : écris ta regexp sur papier telle qu'elle devrait être. Ensuite, double tous les \ qui pourraient être présents.
Exemple :  
Je veux trouver tous les mots encadrés par [: et ]  (ça devrait donner une image qui s'affiche pas, là, because forum de Joce [:ddr555]  
La regexp correspondante sera \[:.+\]
Donc dans une String, on aura : String pattern = "\\[:.+\\]";
 
Voilou.

arghbis a écrit :


et enfin dernier emmerdement en date, la fonction split (String regex) de la classe String, ben elle veut rien savoir! y me dit qu'il la trouve pas cet andouille de compilateur! (ennervement inside, désolé!)


Balance l'erreur du compilo.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 30-04-2003 à 15:14:54    

bon ben là il a pu l'air de gueuler contre split, mais contre autre chose!
 
bon ben je cherche! donc pour le coup de () ça serait (\\(chaine\\)) ??
 
je trouve ça vraiment compliqué les regexp en java, qd c si simple dans d'autres langages (perl par exemple!)

Reply

Marsh Posté le 30-04-2003 à 15:16:31    

arghbis a écrit :

bon ben là il a pu l'air de gueuler contre split, mais contre autre chose!
 
bon ben je cherche! donc pour le coup de () ça serait (\\(chaine\\)) ??
 
je trouve ça vraiment compliqué les regexp en java, qd c si simple dans d'autres langages (perl par exemple!)


 
C surement quasiment aussi simple. Y a juste à doubler les \ qui doivent apparaitre dans le pattern.

Reply

Marsh Posté le 30-04-2003 à 15:30:16    

El_gringo a écrit :


C surement quasiment aussi simple. Y a juste à doubler les \ qui doivent apparaitre dans le pattern.


+1
En fait, ça vient du fait que ta regexp en Perl sera pas contenue dans une chaîne encadrée par des guillemets, contrairement à Java.
Donc faut faire un peu plus gaffe quand tu construis ta regexp puis que tu l'"exportes" en Java :)


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 30-04-2003 à 15:35:41    

bon ben alors je retire un tit peu de ce que j'ai dit (mais pas tout qd même!  :na: )
 
le principal problème que j'avais (outre ces **** de \) , c ke le compilo trouvait pas la moitié des fonctions regexp!
 
la raison : j'ai installé gcj paske je doit compiler du code natif pour un autre truc, et ce con m'a remplacé le javac du sdk par le sien, qui ne trouve pas la moitié des fonctions java!  :fou:  :fou:  
 
bon ben je crois que ça va aller maintenant!!
 
 [:spikler]

Reply

Marsh Posté le 30-04-2003 à 17:55:52    

recoucou!! c moi que revoilou!
 
bon ben il en veut pas de mes parenthèses!  
 
que je mettes ou non un \\ , il pense que ce sont des parenthèses de regroupement!!
 
comment faire? utiliser le code ascii?? je le connais pas moi...
 
help please!

Reply

Marsh Posté le 30-04-2003 à 18:17:43    

crée ta regexp en dhors de java et teste-la
 
une fois qu'elle répond à tes besoins, transforme-la pour qu'elle rentre dans un String java.
 
mais c'est vrai que parfois ça te file une regexp de pendu pour rien :)


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed