ben la je sais pas trop.
Mais en C#, il faut mettre un "@" devant la string représentant le pattern de l'expression régulière, car il aime pas les "\" sinon.
Peut-être en VB.Net pareil ??
ben la je sais pas trop.
Mais en C#, il faut mettre un "@" devant la string représentant le pattern de l'expression régulière, car il aime pas les "\" sinon.
Peut-être en VB.Net pareil ??
et pour ta remarque sur l'option multiline elle est bien mais dommage, elle correspond pas à mon projet si tu vx, je dois lire ligne pas ligne le fichier..
Sinon ça peut-être :
Qu'est-ce que la variable chaine ? un Integer ? en tout cas, ça devrait être le casLoop Until chaine <> ligne2.IndexOf(" SG_")
pour chaine c'est une string c'est pour détecter les début de ligne qui commence par "SG_" donc à chaque fois qu'il trouve un bout de morceau au début qui commence par "BO_", il parcoure ce bout pour trouver toutes les lignes qui commencent par "SG_" et ensuite (et c'est là le souci!) je dois récupérer les nombres qui sont sur cette ligne...
Sinon essai avec un autre Index pour le Group(1).
Essai 0 peut-être.
Et envoi-moi la chaine exact que tu as en entrée STP (la chaine de la ligne qui plante)
Oui mais la méthodepour chaine c'est une string c'est pour détecter les début de ligne qui commence par "SG_" donc à chaque fois qu'il trouve un bout de morceau au début qui commence par "BO_", il parcoure ce bout pour trouver toutes les lignes qui commencent par "SG_" et ensuite (et c'est là le souci!) je dois récupérer les nombres qui sont sur cette ligne...retourne un Integer si je ne m'abuse (en tout cas en C# mais je penses pas que ça soit spécifique au langage ça)
Code : Sélectionner tout - Visualiser dans une fenêtre à part ligne2.IndexOf(" SG_")
Moi j'aurais plus fait :
car je te dis, IndexOf renvoi le la position du caractère si la chaine est trouvée, sinon -1 (ou 0 je sais plus)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while (ligne2.StartWith("BO_")) { // traitement de la ligne }
comme tu m'a expliqué hier à chaque fois qu'on veut un group on lui undique juste le numéro du group pour le récupérer donc là j'ai mis en paramètre le 1er et sa marche pas (group(1)).
et là t'a un exemple du bout de texte que je dois lire dans le fichier texte:
BO_ 257 Trm_CMD_VAIO_P2: 7 VAIO
SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX
SG_ libre_1 : 15|1@0+ (1,0) [0|1] "" Vector__XXX
SG_ Vitesse : 8|9@0+ (1,0) [0|511] "" Vector__XXX
SG_ Consomation_moyenne : 27|4@0+ (1,0) [0|15] "" Vector__XXX
SG_ Vitesse_moyenne : 7|8@0+ (1,0) [0|255] "" Vector__XXX
SG_ Consomation : 14|6@0+ (1,0) [0|63] "" Vector__XXX
donc là comme je t'ai expliqué je lance la lecture du fichier, dès que je détecte la ligne avec le "BO_" je dois lire toutes les lignes qui suivent commençantes par "SG_" afin de récupérer ces nombres..
En VB.Net, le première indice d'une collection n'est-il pas 1 ?
Dans ce cas, le premier group contenant un chiffre est 2 et non 1
Voici mon code en C# qui fonctionne avec le texte que tu m'as donné tout à l'heure:
Attention : je ne vérifie pas que mes lignes commencant pas "SG_" soient bien précédée d'une ligne commençant par "BO_"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 // chaine en entrée (sur plusieurs lignes, cf message #49) string txt = textBox1.Text; // Expression régulière string regexp = @"[^:]*\s([0-9]+)\|([0-9]+)@[^\[]*\[([0-9]+)\|([0-9]+)[\]\w]*"; string result = string.Empty; Regex rg = new Regex(regexp); // Je sépare le texte en autant de lignes string[] lignes = txt.Split(new char[] { '\r', '\n' }); int cpt1 = 0; // Pour chacune des lignes lues foreach (string ligne in lignes) { // Si elle commence par "SG_" if (ligne.StartsWith("SG_")) { // Si mon expression trouve qq chose (mettre un point d'arret ici) if (rg.IsMatch(ligne)) { int cpt = 0; result += "\r\nLIGNE " + cpt1.ToString() + "\r\n"; foreach (Group g in rg.Match(ligne).Groups) { if (cpt > 0) { foreach (Capture c in g.Captures) { result += c.Value + " - "; } } cpt++; } } cpt1++; } } label1.Text = result;
Penses à mettre un point d'arret sur la ligne effectuant le IsMatch, tu sera comme ca si l'expression régulière est valide pour la ligne lue
Le résultat obtenu par mon code :
LIGNE 1
31 - 4 - 0 - 15 -
LIGNE 2
15 - 1 - 0 - 1 -
LIGNE 3
8 - 9 - 0 - 511 -
LIGNE 4
27 - 4 - 0 - 15 -
LIGNE 5
7 - 8 - 0 - 255 -
LIGNE 6
14 - 6 - 0 - 63 -
J'ai fait un truc à la con :sa marche bien mais il récupère pas les bons mais c'est un détail... mais ce qui m'enerve c'est que comme sa sa marche mais en appelant la fonction qui fait ce boulot automatiquement sa ne marche pas ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 ligne = SR.ReadLine() If ligne.StartsWith("BO_") Then ligne2 = SR.ReadLine() If ligne2.StartsWith(" SG_") Then 'position_bit = Func2(ligne2) MsgBox(position_bit) If (rg.IsMatch(ligne2)) Then For Each g In rg.Match(ligne2).Groups result += "\r\nGROUP " + cpt.ToString() + "\r\n" SW.WriteLine(result) MsgBox(result) 'If (cpt > 0) Then For Each c In g.Captures result += c.Value + "\r\n" MsgBox(result) SW.WriteLine(result) Next c 'End If 'cpt += cpt Next g SW.WriteLine(result) End If End If End If
Il semblerait donc que tes pb viennent du fait que la recherche regexp était placée dans une fonction....
si c'etait le cas sa n'aurait pas marcher précedemment pour la detection des mots qui sont après les "BO_"... mais bon , c bizarre sa marche pas toujours...
en fait je sais que ces trucs sont simple mais ce qui me gêne c'est le contexte du projet sur lequel je travaille... celui ci rend un petit peu la détection automatique des strings dans un fichier.txt un peu délicate..
je t'ai dis sa me donne des msgbox vides et quand je le sors du projet sa marche à merveille !! et si sa marche sa me donne n'importe quoi...
je me suis débrouillé avec les tableaux... pour le moment même il y'a une truc qui m'échappe mais si sa a l'air con! je veux vérifier un nombre tapé dans un textbox si il est multiple de 8 donc j'ai ecris sa :
avec n = integer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 If TextBox2.Text = 8 * n Then MsgBox(TextBox2.Text) End If
mais sa marche pas !!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager