Trouver le numéro de ligne par rapport au texte dans un Richtextbox ou Texbox [Résolu]

Signaler
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020
-
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020
-
Bonjour les amis,
J'ai des données qui sont mises à jour chaque seconde dans mon Richtextbox ou Textox (with multiline) pour lire et afficher des données à l'utilisateur comme ci-dessous:

data.......
Z search height: 5.00
Measured points:
0.16250 0.13722 0.10944 0.07917 0.04639 0.01111 -0.02667
0.17278 0.15751 0.13492 0.10500 0.06776 0.02319 -0.02870
0.17917 0.16930 0.14939 0.11944 0.07945 0.02942 -0.03065
0.18167 0.17259 0.15287 0.12250 0.08148 0.02981 -0.03250
0.18028 0.16739 0.14535 0.11417 0.07384 0.02436 -0.03426
0.17500 0.15368 0.12683 0.09444 0.05652 0.01307 -0.03593
0.16583 0.13148 0.09731 0.06333 0.02954 -0.00407 -0.03750
ok
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
data..........


J'ai besoin de récupérer les 7 lignes de nombre qui se trouvent entre le texte "Measured points:" et "ok"

Je me demande s'il est possible de récupérer le numéro de ligne "Measured points:" pour avoir un repère et lire les 7 lignes suivantes ?
Sinon, quelle serait la meilleure solution pour isoler ces données?

Merci beaucoup pour votre aide

14 réponses

Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Avec cette nouvelle syntaxe
(?<=Measured points: \r\n)(.*?)(?=ok)
Ça s’arrête au premier OK, qu’il y ait une ou 20 lignes
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Oui, au lieu de Regex.Match, tu utilises Regex.Matches, et tu prends le dernier de la collection
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Bonjour

Avec cette regex
(?<=Measured points: \r\n)(.*)(?=ok)


Voir un exemple en copiant collant le lien ci après
http://regexstorm.net/tester?p=%28%3f%3c%3dMeasured+points%3a+%5cr%5cn%29%28.*%29%28%3f%3dok%29&i=data.......+%0d%0aZ+search+height%3a+5.00+%0d%0aMeasured+points%3a+%0d%0a0.16250+0.13722+0.10944+0.07917+0.04639+0.01111+-0.02667+%0d%0a0.17278+0.15751+0.13492+0.10500+0.06776+0.02319+-0.02870+%0d%0a0.17917+0.16930+0.14939+0.11944+0.07945+0.02942+-0.03065+%0d%0a0.18167+0.17259+0.15287+0.12250+0.08148+0.02981+-0.03250+%0d%0a0.18028+0.16739+0.14535+0.11417+0.07384+0.02436+-0.03426+%0d%0a0.17500+0.15368+0.12683+0.09444+0.05652+0.01307+-0.03593+%0d%0a0.16583+0.13148+0.09731+0.06333+0.02954+-0.00407+-0.03750+%0d%0aok+%0d%0aX%3a2.42+Y%3a-3.02+Z%3a0.15+E%3a0.00+Count+X%3a+0.00+Y%3a-4.00+Z%3a0.34+E%3a0.00+%0d%0adata..........+&o=s


Il faut activer l’option singleline et si un jour y’a pas 7 lignes ça marchera quand même.

Si tu ne sais pas ce qu’est une regex, voir ici https://lgmorand.developpez.com/dotnet/regex/
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

Bonsoir Whismeril,

Merci pour ta réponse qui m'a l'air top, j'essai de comprendre cette regex avec le lien que tu m'a donné (merci également pour cela).

Dans les exemples donné du cour se serait un "Découpage par séparateur" ou "Découpage par regroupement" ?

Je dirai découpage par séparateur ?
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
C'est pas un découpage, juste une capture.
Et c'est vrai que ce cours n'en parle pas.... J'avais pas vérifié.

Il faut utiliser
Regex.Match
ou
Regex.Matches

https://docs.microsoft.com/fr-fr/dotnet/api/system.text.regularexpressions.regex.matches?view=netcore-3.1

Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

D'accord,

J'essai ceci :

Dim myString As String = Txt_data.Text
        Dim regex = New Regex("?<=Measured points: \r\n)(.*)(?=ok")
        Dim match = regex.Match(myString)
        If match.Success Then
       
            Txt_recup_point.Text = match.Value
        End If


mais j'ai du mal à comprendre comment assigné correctement le regex
?<=Measured points: \r\n)(.*)(?=ok


cela me retourne :
Une exception non gérée du type 'System.ArgumentException' s'est produite dans System.dll

Informations supplémentaires : analyse de "?<=Measured points: \r\n)(.*)(?=ok" - Quantificateur {x,y} ne suivant rien.

Peut-tu m'en dire un peu + sur l'utilisation ? :)
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Depuis le temps tu pourrais utiliser correctement les balises de code.
C’est pénible à force.
Je te remets une fois de plus le lien vers le petit tuto sur le sujet.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour ton problème, la regex doit commencer par une parenthèse, tu ne l’as pas mise
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

Mes excuses pour le code, je ne comprend pas pour la parenthèse car elle y est après le regex ? ou alors je n'ai pas compris :(
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Ha ben, elle manque à la fin aussi
Dim regex = New Regex("(?<=Measured points: \r\n)(.*)(?=ok)")

Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

C'est également ce que je vient d'essayer mais je n'ai aucun retour dans mon Txt_recup_point.Text

 Dim myString As String = Txt_data.Text
        Dim regex = New Regex("(?<=Measured points: \r\n)(.*)(?=ok)")
        Dim match = regex.Match(myString)
        If match.Success Then

            Txt_recup_point.Text = match.Value
        End If



Est-ce que le soucis pourrai venir des retours à la ligne ou l'espace devant chaque ligne ?

Z search height: 5.00
Measured points:
  0.16250  0.13722  0.10944  0.07917  0.04639  0.01111  -0.02667
  0.17278  0.15751  0.13492  0.10500  0.06776  0.02319  -0.02870
  0.17917  0.16930  0.14939  0.11944  0.07945  0.02942  -0.03065
  0.18167  0.17259  0.15287  0.12250  0.08148  0.02981  -0.03250
  0.18028  0.16739  0.14535  0.11417  0.07384  0.02436  -0.03426
  0.17500  0.15368  0.12683  0.09444  0.05652  0.01307  -0.03593
  0.16583  0.13148  0.09731  0.06333  0.02954  -0.00407  -0.03750
ok
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
Messages postés
14457
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
1 juillet 2020
420
Ha oui, il faut mettre l’option SingleLine je te l’ai dit dès le premier message
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

voila :
    Dim myString As String = RichTextBox_data.Text
        Dim regex = New Regex("(?<=Measured points:)(.*)(?=ok)", RegexOptions.Singleline)
        Dim match = regex.Match(myString)
        If match.Success Then
            Txt_recup_point.Text = match.Value
        End If



En revanche comme j'ai d'autre "ok" qui sont placé après comme suit :
Num X,Y: 7,7
Z search height: 5.00
Measured points:
  0.16250  0.13722  0.10944  0.07917  0.04639  0.01111  -0.02667
  0.17278  0.15751  0.13492  0.10500  0.06776  0.02319  -0.02870
  0.17917  0.16930  0.14939  0.11944  0.07945  0.02942  -0.03065
  0.18167  0.17259  0.15287  0.12250  0.08148  0.02981  -0.03250
  0.18028  0.16739  0.14535  0.11417  0.07384  0.02436  -0.03426
  0.17500  0.15368  0.12683  0.09444  0.05652  0.01307  -0.03593
  0.16583  0.13148  0.09731  0.06333  0.02954  -0.00407  -0.03750
ok
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok


Il me prend en compte le dernier "ok" et je me retrouve donc avec ceci dans mon exemple :

  0.16250  0.13722  0.10944  0.07917  0.04639  0.01111  -0.02667
  0.17278  0.15751  0.13492  0.10500  0.06776  0.02319  -0.02870
  0.17917  0.16930  0.14939  0.11944  0.07945  0.02942  -0.03065
  0.18167  0.17259  0.15287  0.12250  0.08148  0.02981  -0.03250
  0.18028  0.16739  0.14535  0.11417  0.07384  0.02436  -0.03426
  0.17500  0.15368  0.12683  0.09444  0.05652  0.01307  -0.03593
  0.16583  0.13148  0.09731  0.06333  0.02954  -0.00407  -0.03750
ok
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00
ok
ok T:149.9 /150.0 B:60.9 /60.0 T0:149.9 /150.0 @:20 B@:14 P:59.3 A:31.7
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00


Est-ce que cela est "réglable" pour vraiment prendre en compte que le "ok" qui se situe juste apès les 7 lignes ?
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

ah d'accord je pensais que tu parlais du SingleLine à cocher uniquement sur le site http://regexstorm.net/

Bon je continue mes recherches pour ajouter cela :) Merci pour ces précisions
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

Génial ! merci

Dans le cas ou j'ai plusieurs Match comme ceci :

data....... 
Z search height: 5.00 
Measured points: 
 0.16250 0.13722 0.10944 0.07917 0.04639 0.01111 -0.02667 
 0.17278 0.15751 0.13492 0.10500 0.06776 0.02319 -0.02870 
 0.17917 0.16930 0.14939 0.11944 0.07945 0.02942 -0.03065 
 0.18167 0.17259 0.15287 0.12250 0.08148 0.02981 -0.03250 
 0.18028 0.16739 0.14535 0.11417 0.07384 0.02436 -0.03426 
 0.17500 0.15368 0.12683 0.09444 0.05652 0.01307 -0.03593 
 0.16583 0.13148 0.09731 0.06333 0.02954 -0.00407 -0.03750 
ok 
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00 
data.......... 
ok
data....... 
Z search height: 5.00 
Measured points: 
 0.16250 0.13722 0.10944 0.07917 0.04639 0.01111 -0.02667 
 0.17278 0.15751 0.13492 0.10500 0.06776 0.02319 -0.02870 
 0.17917 0.16930 0.14939 0.11944 0.07945 0.02942 -0.03065 
 0.18167 0.17259 0.15287 0.12250 0.08148 0.02981 -0.03250 
 0.18028 0.16739 0.14535 0.11417 0.07384 0.02436 -0.03426 
 0.17500 0.15368 0.12683 0.09444 0.05652 0.01307 -0.03593 
 0.16583 0.13148 0.09731 0.06333 0.02954 -0.00407 -0.03750 
ok 
X:2.42 Y:-3.02 Z:0.15 E:0.00 Count X: 0.00 Y:-4.00 Z:0.34 E:0.00 
data.......... 
ok



Est-il possible d'avoir toujours le dernier reçu ?
Merci beaucoup pour ton aide j'arrive enfin à avancer un peu :)
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

D'ac je vais chercher cela.
Merci pour toute l'aide apportée ;)