Chêne des caractère

Résolu
dadibarca23 Messages postés 67 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 6 octobre 2019 - 9 avril 2016 à 13:33
dadibarca23 Messages postés 67 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 6 octobre 2019 - 10 avril 2016 à 12:29
Bonsoir,

mes amis com ta vous

jai un chêne de caractère :

chêne = "dadi 195 sw d3 : 1500,45 sd 189 fdys, 23 ghdkj"
la chêne changer a chaque Foix

la question : comment supprimer touts la chêne sauf le nombre décimale

après la suppression: chêne = "1500,45"

merci bien de me aidés amis

4 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
9 avril 2016 à 18:30
Bonsoir dadibarca23,

Je te propose 2 possiblités pour récupérer "1500,45":
1) Split sur ":", puis Split sur " ";
2) Regex.

Ajouter la référence System.Text.RegularExpressions pour la Regex.
Option Strict On
Option Explicit On
Imports System.Text.RegularExpressions

    Dim str As String = "dadi 195 sw d3 : 1500,45 sd 189 fdys, 23 ghdkj"
Dim str1 As String = str.Split(New Char() {CChar(New String(":"c, 1))}, StringSplitOptions.None)(1).TrimStart()

MessageBox.Show(str,"chaine complète")

MessageBox.Show(str1.Split(New Char() {CChar(New String(" "c, 1))}, StringSplitOptions.None)(0),"Ex avec Split")

MessageBox.Show(showMatch(str, "\:(.[0-9]+)(.[0-9]+)"),"Ex avec Regex")

Function showMatch(ByVal input As String, ByVal pattern As String) As String
Dim regex As Regex = New Regex(pattern, RegexOptions.IgnoreCase)
Dim match As Match = regex.Match(input)
If match.Success Then
Return match.Value.Replace(":", "").Trim
End If
Return String.Empty
End Function

La regex est préférable d'utilisation car pas de plantage si ta chaine en entrée ne contient pas de ":", alors que le split provoque une erreur si ":" est absent.
1
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 avril 2016 à 18:36
Split ne renvoi pas d'erreur, mais un tableau avec un seul élément, ensuite à toi de controler si ton tableau a la taille voulue.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
9 avril 2016 à 18:47
Bonsoir NHenry,

Avec l'expression (j'ai remplacé : par !)
        Dim str As String = "dadi 195 sw d3 ! 1500,45 sd 189 fdys, 23 ghdkj"
Dim str1 As String = str.Split(New Char() {CChar(New String(":"c, 1))}, StringSplitOptions.None)(1).TrimStart()
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
Modifié par NHenry le 9/04/2016 à 18:58
Non, car tu cherches l'élément 1 avant de controler la raille.
Dim lStr="..."
Dim ltData=lStr.Split (":")
if(ltData.Length>1) then
    MessageBox.Show ltData(1)
else
    MessageBox.Show("Pas trouvé")
End If


Code tapé directement ici donc pas forcément totalement juste (Avec Option Infer à On).
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
9 avril 2016 à 19:09
Oui , NHenry, tu as raison, mais à notre ami dadibarca23 de prévoir en fonction de l'exactitude de ses données en entrée.
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 !!!
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
9 avril 2016 à 23:52
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

1
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
10 avril 2016 à 10:26
Bonjour Whismeril,

Un grand merci pour toutes tes explications.
L'approche des Regex fait peur au début, mais après quelques tâtonnements, on s'aperçoit de sa puissance d'extraction de chaines.

Bon dimanche,
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
Modifié par Whismeril le 10/04/2016 à 11:02
Bonjour

et là c'est plutôt basique.

par exemple, dans la source d'origine, la regex est bien utilisé, blq cherche une "clause" supplémentaire, mais fait des if sur le début du texte, puis un Replace...

Ben en cherchant un peu, un seul pattern fait tout.
Il est un peu plus complexe dans le sens ou il y a des groupements qui retourne plusieurs "valeurs", on va donc chercher pour chaque occurrence, les captures existantes.

Bon week end à toi

Edit: j'ai mis les impressions d'écran du site de test, car le nom des groupements est une particularité de .Net que ce site prend en compte.
L'avantage aussi est de voir de suite le résultat, et de ne se concentrer que sur le pattern, avant de réfléchir à ce qu'on fait du résultat en VB.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
Modifié par NHenry le 9/04/2016 à 14:09
On ne dit pas un chêne de caractère (qui lui est un arbre assez singulier), mais une chaîne de caractères (dans le sens, des caractères sont à la suite les un des autres en mémoire).

Tu peux essayer un Split sur les espaces puis repérer la valeur du tableau contenant le caractère ",".

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
0
dadibarca23 Messages postés 67 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 6 octobre 2019
10 avril 2016 à 12:29
bon jour
mes amis et merci bien pour les explication si magnifique


je résolu mon problème

voila le cas
======================================
Dim pattern As String = "\b\d+(,\d{3})*\.\d{2}\b"
Dim input As String = (strResponse)
For Each match As Match In Regex.Matches(input, pattern)
dadi23 = (match.Result("$&"))

Next
=======================================
car le chaine de mon programme recevé a chaque Foix des caractère défirent et une seul nombre décimal
exp: chaine = gfhfh 5100,45 hjfkl 5 erhy
chaine = gfd 5 gfhf : 12354,45 hig kl
dans se cas les deux points (:) sa change et remplacer par un autre symbole exp : vergule , espace ect ...
et ma rol just garder le premier nombre décimale et supprimer les autre .

encore une Foix merci amis
0
Rejoignez-nous