IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Expressions régulières : ne matcher qu'une seule fois


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Avatar de sroux
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 516
    Points
    516
    Par défaut Expressions régulières : ne matcher qu'une seule fois
    Bonjour,

    Découvrant les expressions régulières de VB.Net je souhaiterai ne remplacer que la première expression trouvée.
    Actuellement je souhaite remplacer le premier espace apparaissant dans ma chaîne par un autre caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    finalLine = Regex.Replace(line, " ", "|")
    Cependant tous les espaces sont remplacés avec le code ci-dessus.

    Je n'ai pas ce problème en Java où j'utilise le code suivant pour remplacer les 4 premiers caratères par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int counter = 0; counter <= 3; counter++) {
      line = regEx.substitute("s/ /|/",line);
    }
    Merci d'avance pour toute aide!

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si tu veux remplacer seulement le premier espace, utilise IndexOf pour le trouver et ensuite tu le remplaces. Un expression régulière n'est pas nécessaire pour ça.

    Cela donnerait quelque chose comme
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string s = "une chaine avec pleins d'espaces";
    char[] chars = s.ToCharArray();
    chars[s.IndexOf(" ")] = '|';
    s = new string(chars);

    Pour la forme, la même chose avec une expression régulière donnerait
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string s = "une chaine avec pleins d'espaces";
    s = Regex.Replace(s3, @"(?<= ) ", "|");
    C'est plus court certes, mais moins performant. Donc si tu fais ça souvent il faut en tenir compte.

    Pour finir, afin de reprendre l'exemple Java, tu peux passer par la surcharge de Regex.Replace attendant un MatchEvaluator afin de contrôler plus "finement" le remplacement
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    string s = "une chaine avec pleins d'espaces";
    int i = 0;
    string s1 = Regex.Replace(s, " ",
        delegate(Match m)
        {
            if (i < 3)
            {
                i++;
                return "|";
            }
            else
            {
                return m.Value;
            }
        });

    Il ne te reste qu'a mettre ça en VB.Net
    Pas de questions techniques par MP

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il suffit d'ajouter en dernier paramètre le nombre maximum de remplacements à effectuer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    finalLine = Regex.Replace(line, " ", "|", 1)
    Cela dit, c'est un peu "violent" d'utiliser une regex pour un truc aussi simple... La fonction String.Replace ne permet malheureusement pas de spécifier le nombre de remplacements, mais si c'est juste pour un caractère tu peux faire comme indiqué par StormimOn. Le voilà en VB.NET, avec juste une petite modification pour gérer le cas où le caractère à remplacer est absent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim s As String = "une chaine avec pleins d'espaces"
    Dim chars as Char() = s.ToCharArray()
    Dim index As Integer = chars.IndexOf(" ")
    If index >= 0 Then
        chars(index) = "|"
        s = New String(chars)
    End If

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par tomlev
    Il suffit d'ajouter en dernier paramètre le nombre maximum de remplacements à effectuer...
    Je ne savais pas que cela existait et je viens de le voir en effet, mais ce n'est pas disponible sur les méthodes statiques. Il faut créer l'objet Regex et appeler la méthode Replace de cet objet. Comme j'utilise toujours les méthodes statiques je suis passé à côté de ça ^^

    Citation Envoyé par tomlev
    avec juste une petite modification pour gérer le cas où le caractère à remplacer est absent :
    Je n'ai pas pris soins de gérer ça effectivement

    Sinon on peut aussi utiliser un StringBuilder pour ça. C'est peut être encore plus performant (si la performance est un facteur à intégrer). Après conversion en VB.Net cela donnerait quelque chose comme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim s As String = "une chaine avec pleins d'espaces"
    Dim index As Integer = s.IndexOf(" ")
    If index >= 0 Then
        Dim b As StringBuilder = New StringBuilder(s)
        b(index) = "|"C
        s = b.ToString()
    End If
    Pas de questions techniques par MP

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    mais ce n'est pas disponible sur les méthodes statiques
    ah oui, au temps pour moi...

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par tomlev Voir le message
    ah oui, au temps pour moi...
    Y'a pas de mal, j'en sors des bien plus grosses parfois
    Pas de questions techniques par MP

  7. #7
    Membre confirmé
    Avatar de sroux
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 516
    Points
    516
    Par défaut
    Merci pour vos réponses, j'en ferais bon usage!

    En effet cela ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    finalLine = Regex.Replace(line, " ", "|", 1)
    c'est un peu "violent" d'utiliser une regex pour un truc aussi simple
    Cependant les différentes réponses s'avèrent plus "violentes" nécessitant plus de code pour faire un pauvre replace qui ne prendrait que peu de code en Java.

Discussions similaires

  1. expression lambda evaluee qu'une seule fois
    Par vandamme dans le forum Boost
    Réponses: 10
    Dernier message: 17/12/2009, 14h49
  2. [IDE]Comment télécharger VS2005 Express une seule fois?
    Par zamine81 dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 05/01/2006, 18h14
  3. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  4. Réponses: 18
    Dernier message: 10/02/2005, 13h22
  5. Réponses: 2
    Dernier message: 30/11/2004, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo