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

Messages postés
63
Date d'inscription
mercredi 3 octobre 2012
Dernière intervention
21 novembre 2018
- - Dernière réponse : dadibarca23
Messages postés
63
Date d'inscription
mercredi 3 octobre 2012
Dernière intervention
21 novembre 2018
- 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

4 réponses

Meilleure réponse
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
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.

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

NHenry
Messages postés
14325
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
> NHenry
Messages postés
14325
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
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
Messages postés
14325
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
> NHenry
Messages postés
14325
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
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
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
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
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
> cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
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
Messages postés
14325
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
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
Messages postés
63
Date d'inscription
mercredi 3 octobre 2012
Dernière intervention
21 novembre 2018
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.