Chêne des caractère [Résolu]

dadibarca23 56 Messages postés mercredi 3 octobre 2012Date d'inscription 12 juillet 2017 Dernière intervention - 9 avril 2016 à 13:33 - Dernière réponse : dadibarca23 56 Messages postés mercredi 3 octobre 2012Date d'inscription 12 juillet 2017 Dernière intervention
- 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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 9 avril 2016 à 18:30
1
Merci
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.

Merci cs_JMO 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - 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.
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - 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
NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - 9 avril 2016 à 18:57
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).
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - 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 !!!
Commenter la réponse de cs_JMO
Meilleure réponse
Whismeril 12024 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 septembre 2018 Dernière intervention - 9 avril 2016 à 23:52
1
Merci
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

Merci Whismeril 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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,
Whismeril 12024 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 septembre 2018 Dernière intervention > cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 10 avril 2016 à 10:54
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.
Commenter la réponse de Whismeril
NHenry 14260 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 septembre 2018 Dernière intervention - Modifié par NHenry le 9/04/2016 à 14:09
0
Merci
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"
Commenter la réponse de NHenry
dadibarca23 56 Messages postés mercredi 3 octobre 2012Date d'inscription 12 juillet 2017 Dernière intervention - 10 avril 2016 à 12:29
0
Merci
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
Commenter la réponse de dadibarca23

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.