[Résolu] Convertir regexp Perl->Java

Convertir regexp Perl->Java [Résolu] - Java - Programmation

Marsh Posté le 28-12-2010 à 18:20:26    

Bonjour,
 
Je réalise un programme en Java et j'ai un fragment de code perl que je n'arrive pas à convertir, utilisant les regex pour récupérer les mots d'une chaine de caractères.
 
Voici le code perl qui me pose problème :

Citation :

@formes = split(/\s*[,\.\?\!\;\:\(\{\[\)\]\}]?\s+/, $ligne);


 
que j'ai tenté de convertir en Java :  
String[] mots = ligne.split("\\s*[\\.\\,\\!\\?\\;\\:\\(\\)\\{\\}\\[\\]]?\\s+" );
 
Mais vu le résultat de mon programme, ça n'a pas l'air de très bien fonctionner (le reste de mon programme est Ok).
 
De même, je n'arrive pas à traduire :

Citation :

if ($forme !~ /^(.)\1+$/ && $forme !~ /^(\s+|[\s\&\"\'\#\{\(\[\|\-\`\\\_\)\]\=\}\*\+\:\%]+)$/) { ... }


 
 
Voilà, si un expert Java a un peu de temps à me consacrer je l'en remercie beaucoup. :jap:


Message édité par axert19 le 29-12-2010 à 20:42:08
Reply

Marsh Posté le 28-12-2010 à 18:20:26   

Reply

Marsh Posté le 28-12-2010 à 20:42:51    

En tout cas, écrire en perl [,\.\?\!\;\:\(\{\[\)\]\}] dans une regexp, c'est déjà surprenant, vu que dans un groupement de caractères entre [ et ] il n'y a pas besoin d'échapper avec \ la plupart des caractères (sauf \] bien sur, \\, \-, \b, et \^ s'il figure en premier).
Donc ceci serait beaucoup plus justement réécrit en perl comme [,.?!;:({[)\]}] voire [][(){},.?!;:] (cette dernière forme obtenue car il y a des règles spéciales pour \] qu'on trouve dans la doc perl, à Special Characters Inside a Bracketed Character Class: si le ] est après le [ ou [^ il a son sens habituel de caractère et non de fin de classe commençant avec [, sinon, il faut employer \].)
A+,


Message édité par gilou le 28-12-2010 à 20:46:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-12-2010 à 19:44:00    

Bonjour,

 

merci beaucoup pour ta réponse. En fait j'avais mal lu, la chaîne de découpage est la suivante :

Citation :

 @formes = split(/[\p{IsPunct}\p{IsSpace}\p{IsBlank}\p{IsDigit}]+/, $ligne);

 

if ($forme !~ /^(.)\1+$/ && $forme !~ /^(\s+|[\s\&\"\'\#\{\(\[\|\-\`\\\_\)\]\=\}\*\+\:\%]+)$/)
{...}

 

et

Citation :

if ($ngram !~ /^[\s&\"\'\#\{\(\[\|\-\`\\\_\)\]\=\}\*\+\:\%]+$/)
{...}

 

Mais ta remarque est valable et j'en prends note. Du coup, j'en déduis pour le deuxième quote qu'il s'agit de vérifier que la variable ne doit pas être constituée uniquement des caractères  : \s&"'#{([|-`\_)]=}*+:%... Que j'ai donc traduit en java par :
if(! Pattern.matches("^[\\s&\"'#{(\\[|-`\\_)\\]=}*+:%]+$", ngram) ) {...}
Mais j'ai une exception à l'exécution (caractères inattendus dans la regex...)

 

En fait c'est dommage car les résultats que j'obtiens ne sont pas super, alors que le reste de mon script marche :/ . En fait il s'agit d'un projet pour déterminer la langue d'un document de langue inconnue... et donc si les mots du fichier à analyser sont mal découpés (en utilisant justement ces regex) ça fausse les calculs  :pt1cable:

 


[edit] : en fait là où apparait un '\' en perl, et bien il suffit de rajouter un \ en java, sauf dans le cas de certains caractères : \", \' ... qui restent pareil.

 

De même pour \p{isPunct} qui va devenir en java \\p{Punct} (bien Punct et pas isPunct)


Message édité par axert19 le 29-12-2010 à 23:41:37
Reply

Marsh Posté le 30-12-2010 à 00:25:59    

Tu avais regardé les techniques employées dans le module perl Lingua::Identify ?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-12-2010 à 01:53:45    

Bonsoir,

 

En fait il s'agit d'un tp scolaire. Une première étape consiste à se servir de documents existants dans différentes langues et d'apprendre les mots. En fonction de leurs occurrences dans les fichiers on détermine les probabilités liant les mots aux différentes langues.

 

Puis une deuxième étape consiste à déterminer la langue d'un document inconnu. On procède de même mais au lieu de réaliser une phase d'apprentissage on va utiliser les résultats précédents pour calculer les probabilités du fichier d'appartenir à chacune des langues (voire aucune si les mots n'ont pas tous été trouvés dans notre "dictionnaire" ).

 

C'est pas très utile, mais c'est dans un cadre scolaire :D  :jap:


Message édité par axert19 le 30-12-2010 à 01:58:58
Reply

Marsh Posté le 07-01-2011 à 17:52:05    

Salut,
Alors très rapidement car le weekend n'attend pas (ouioui 17h50), je propose la regex approximative suivante, si le but est comme je l'imagine de capturer les mots:
"[A-Za-z]+[\\.\\,\\!\\?\\;\\:\\(\\)\\{\\}\\[\\] ]+"
 
Bonne année!


Message édité par Ju - le 07-01-2011 à 17:52:36
Reply

Sujets relatifs:

Leave a Replay

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