Regex

Résolu
Chihaya Messages postés 144 Date d'inscription   Statut Membre Dernière intervention   -  
Nexii Messages postés 338 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
je cherche a créer une expression régulière me permettant de vérifier le contenue d'un fichier.
Ce fichier contient 50 'mots' séparés par des espaces qui sont soit 'n' soit un nombre.
le nombre peut être négatif, et contient entre 1 et 8 chiffres.
Exemple de fichier :
n ... n n n -16711681 n n n n n n n n n n -16711681 -16711936 -16711936 -16711936 n ... n
J'ai pour l'instant ceci :
([n]|\ |\-?\d{1,8})
Qui lit soit 'n', soit un espace, soit un nombre de 1-8 chiffres positif ou négatif.
Cependant je n'arrive pas à faire en sorte de vérifier que le texte comprend exactement 50 mots.
J'utilise le site https://regexr.com/ pour tester mon expression.
Savez-vous comment faire?
Merci

3 réponses

Nexii Messages postés 338 Date d'inscription   Statut Membre Dernière intervention   588
 
Salut,

Déjà, ton expression prend le groupe (lettre ou chiffe + espace) est-ce bien ce que tu souhaite ?
Qu'est ce qu'un mot : une lettre, un chiffre, un espace sont 3 mots différents ou une lettre et un espace forment un seul mot ? Dans ce dernier cas, souhaites-tu catcher les espaces ?
Enfin, pour les 50 mots il suffirait d'un compteur qui s'incrémente dès que tu catche un espace, ou alors tu utilise le "split" sur les espaces pour obtenir un tableau de mot et suffit de faire .length dessus.
0
Chihaya Messages postés 144 Date d'inscription   Statut Membre Dernière intervention   8
 
Maintenant que je relis j'ai très mal expliqué.
En gros mon fichier contient des mots séparés par des espaces. Un mot est soit la lettre n, soit un nombre.
J'aimerai vérifier que mon texte est bien de ce format, c'est a dire qu'il possède 50 mots de type n/nombre.
du coup j'ai réfléchi un peu depuis, et j'ai obtenu ça :
([n\ ]|\-?\d{1,8}\ ){50}
Le problème est que si j'entre cette regex et mon fichier dans le site que j'ai fourni, elle ne lit pas la totalité de la chaine.
(n\s|\-?\d{1,8}\s)
0
Chihaya Messages postés 144 Date d'inscription   Statut Membre Dernière intervention   8
 
Bon au final j'ai contourné mon problème,
vu que je suis en java, j'ai fait :
Pattern pattern;
Matcher matcher;
pattern = Pattern.compile("n\\s|\\-?\\d{1,8}\\s");
matcher = pattern.matcher(s);
int cpt =0;
while(matcher.find()) {
cpt++;
}

Il me suffit à la fin de vérifier cpt pour voir combien de mots ont été trouver.
Problème résolu donc !
0
Nexii Messages postés 338 Date d'inscription   Statut Membre Dernière intervention   588
 
public static void main(String[] args) {
 String fichier = "n -1600005 16005 n n n 160000 k";
 Pattern p = Pattern.compile("([n]|\\-?\\d{1,8})");
 Matcher m = p.matcher(fichier);
 int nb = 0;
 while (m.find()) {
  nb += m.groupCount();
 }
 System.out.print("nb = " + nb);
 }



Sortie console : nb = 7;
Attention, j'ai retiré les espaces de ton expression pour éviter qu'il ne les compte.
0
Chihaya Messages postés 144 Date d'inscription   Statut Membre Dernière intervention   8
 
Je n'avais pas vu ta solution, elle fonctionne également.
Merci !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Chaque mot est séparé d'un espace ? Alors découpes ton texte sur les espaces (avec split) et compte le nombre de case du tableau.

public static void main(String[] args) {
    String fichier = "n -1600005 16005 n n n 160000 k";
    System.out.print(fichier.split(" ").length); // 8
}
0
Nexii Messages postés 338 Date d'inscription   Statut Membre Dernière intervention   588
 
Non car si le fichier contient un autre mot que "n" ou un nombre qui ait + de 8 digit, alors il y a erreur.
0