Regex

Résolu/Fermé
Chihaya Messages postés 144 Date d'inscription samedi 22 juin 2013 Statut Membre Dernière intervention 23 février 2021 - 29 mars 2016 à 15:19
Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 - 31 mars 2016 à 13:49
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 jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 570
29 mars 2016 à 15:58
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 samedi 22 juin 2013 Statut Membre Dernière intervention 23 février 2021 8
Modifié par Chihaya le 29/03/2016 à 16:15
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 samedi 22 juin 2013 Statut Membre Dernière intervention 23 février 2021 8
29 mars 2016 à 16:18
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 jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 570
Modifié par Nexii le 29/03/2016 à 16:19
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 samedi 22 juin 2013 Statut Membre Dernière intervention 23 février 2021 8
29 mars 2016 à 16:34
Je n'avais pas vu ta solution, elle fonctionne également.
Merci !
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
29 mars 2016 à 21:12
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 jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 570
31 mars 2016 à 13:49
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