Bonsoir
le truc c'est que dadibarca pose questions sur questions ou à chaque fois le "pattern" change un peu, donc une fois on lui propose un split, l'autre un Replace etc....
Au final, je lui ai poussé un tuto sur les Regex ou il y a tout pour répondre aux 2 questions qu'il a posté après.... Enfin s'il prend le temps de le lire.
Pour le cas de ce soir, dans l'optique Regex. Je n'ai pas testé le code complet de JMO, juste le pattern (j'ai juste viré le \ qui ne sert à rien).
Le site surligne en vert l'occurrence, qui est à peu près ce que l'on cherche:
": 1500,45"
On voit aussi, en dessous que
$1 vaut ": 1500"
$2 vaut ",45"
On peut améliorer:
- [0-9] peut être remplacé par \d
- Les $ viennent des parenthèses présentes dans le pattern, un jeu de () a un double rôle, un similaire aux mathématiques, par exemple je veux répéter 3 fois un chiffre et !
"(\d!){3}
c'est bien la clause \d! qui sera répétée 3 fois. Le second rôle est de créer un groupement, le contenu de ce groupement est récupérable, ici c'est $1 et $2.
L'idée serait de faire un groupement qui extrait directement le nombre.
On voit que je n'ai plus qu'un groupement qui vaut 1500,45.
Et s'il y a deux nombres dans le texte:
Je n'ai toujours qu'un groupement, mais plusieurs "lignes", ce sont les occurrences.
Ok, mais si je mélange des parenthèses arithmétiques (qui créent aussi des groupements) et des parenthèses groupement, y a un moment ou je ne saurais plus ou j'en suis.
Il suffit de donner un nom au groupement qui nous intéresse.
Reste maintenant à voir ce que ça donne en VB.
Cas de 1 occurrence
Dim texte As String = "dadi 195 sw d3 : 1500,45 sd 189,1234567890 fdys, 23 ghdkj"
Dim patern As String = "(.+ )+: (?<nombre>\d+,\d+)"
Dim m As Match = Regex.Match(texte, patern)
Dim nouveauText As String = texte
If (m.Success) Then
nouveauText = m.Groups("nombre").Value
End If
Cas de 2 occurrences
Dim texte As String = "dadi 195 sw d3 : 1500,45 sd 189,1234567890 fdys, 23 ghdkj"
Dim patern As String = "(?<nombre>\d+,\d+)"
Dim nouveauText As List(Of String) = New List(Of String)()
For Each m As Match In Regex.Matches(texte,patern)
If (m.Success) Then
nouveauText.Add(m.Groups("nombre").Value)
End If
Next
9 avril 2016 à 18:36
9 avril 2016 à 18:47
Avec l'expression (j'ai remplacé : par !)
str1 me lève l'erreur
Une exception non gérée du type 'System.IndexOutOfRangeException' s'est produite dans Tests divers.exe
Informations supplémentaires : L'index se trouve en dehors des limites du tableau.
Oui, effectivement, il faudrait positionner un Try...Catch
Modifié par NHenry le 9/04/2016 à 18:58
Code tapé directement ici donc pas forcément totalement juste (Avec Option Infer à On).
9 avril 2016 à 19:09
Perso, quand j'utilise un string.split(....)(1), je suis certain de mes datas et que l'index 1 existe.
J'utilise assez souvent le ltData.Length avec un Select Case.
Cela sous-entend de priviliger la Regex !!!