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

C# Discussion :

C# expression reguliere


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 64
    Points : 47
    Points
    47
    Par défaut C# expression reguliere
    bonjour a tous

    je souhaite simplifier ce gout de code : en utilisant simplement une expression réguliere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                string versionVe = string.Empty; 
                string versionVi = string.Empty; 
                string patternVE = @"VE(?<versionVe>\d{2})"; 
                string patternVI = @"VI(?<versionVi>\d{2})"; 
                string fileName = "D:\\MDT_REFERENTIEL\\Systeme d'exploitation\\Socle\\VE01\\VI08\\toto.wim"; 
                Match match1 = new Regex(patternVE).Match(fileName); 
                versionVe = match1.Groups["versionVe"].Value; 
                Match match2 = new Regex(patternVI).Match(fileName); 
                versionVi = match2.Groups["versionVi"].Value; 
                 socleName = Path.GetFileName(fileName);
    merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce code ci devrait normalement fonctionner :

    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
     
    string versionVE = string.Empty;
    string versionVI = string.Empty;
    string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))|(VI(?<versionVi>\d{2}))(?=\\)";
    Regex regexPattern = new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
    string fileName = "D:\\MDT_REFERENTIEL\\Systeme d'exploitation\\Socle\\VE01\\VI08\\toto.wim";
    MatchCollection matches = regexPattern.Matches(fileName);
    foreach(Match m in matches)
    {
       if (string.IsNullOrEmpty(versionVE))
          versionVE = m.Groups["versionVe"].Value;
       if (string.IsNullOrEmpty(versionVI))
          versionVI = m.Groups["versionVi"].Value;
    }

    Explication supplémentaire :

    J'ai mis 2 options pour l'expression régulière :
    - ExplicitCapture : pour ne pas qu'il capture les expressions non nommées, comme il y en a avec mes parenthèses supplémentaires.
    - IgnoreCase : un oubli que tu avais fait et qui est nécessaire car pour rappel les chaînes de caractères sont "case insensitive" pour les systèmes d'exploitation Windows.

    Autre point aussi : avant, si dans ta chaîne tu as un "toto\titi\trucvi02bidule", ça allait aussi être capturé comme expression. J'ai donc rajouté des "assertions de préanalyse et de postanalyse positives de largeur nulle" pour indiquer que ça doit être précédé et suivi par un caractère "\".

    Je n'ai pas testé l'expression mais ça devrait fonctionner.

    Pour finir, il y a toujours cette page en cas de besoins

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 64
    Points : 47
    Points
    47
    Par défaut
    Je vois pas l'interet d'utiliser le foreach:
    Par contre j ai empty dans matchA.Groups["versionVi"].Value c'est normal car au debug il trouve que matchA.Groups["versionVe"].Value

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                    string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))|(VI(?<versionVi>\d{2}))(?=\\)";
                    Match matchA = new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Match(e.Node.Tag.ToString());
                    this.labelVersImgTxt.Text = "ve" + matchA.Groups["versionVe"].Value + "_vi" + matchA.Groups["versionVi"].Value;

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il me semble que faire le "foreach" est quand même nécessaire car le premier match va trouver l'expression en "VE" et le second va trouver l'expression en "VI".

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 64
    Points : 47
    Points
    47
    Par défaut
    on est pas obligé d'utiliser le foreach car j ai cet exemple qui dit le contraire:

    ceci marche niquel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                string PatternVersionApp = @"(?<version>ve(\d(?:.+)?)_vi(.+?)?)?(-(?<specification>.*))?";
                string PatternFileNameApp = @"^(?:(?<name>.*?)?-" + PatternVersionApp + @"(?<extension>\.\w{3,4}?))$";
                Match match = new Regex(Constantes.PatternFileNameApp).Match(fileName);
                name = match.Groups["name"].Value;
                version = match.Groups["version"].Value;
                specification = match.Groups["specification"].Value;
                extension = match.Groups["extension"].Value;

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ah, finalement le format a changé par rapport au début?

    Oui, on pouvait toujours remanier l'expression régulière pour qu'il attrape toutes les infos d'un coup, c'est vrai.

    Si tu as trouvé la solution tout seul c'est super mais penses bien à tester tous les petits cas particuliers.

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 64
    Points : 47
    Points
    47
    Par défaut
    le probleme est que je n arrive pas a mettre en place cette methode "de tout connaitre d'un coup"

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Citation Envoyé par langme Voir le message
    Je vois pas l'interet d'utiliser le foreach:
    Par contre j ai empty dans matchA.Groups["versionVi"].Value c'est normal car au debug il trouve que matchA.Groups["versionVe"].Value

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                    string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))|(VI(?<versionVi>\d{2}))(?=\\)";
                    Match matchA = new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Match(e.Node.Tag.ToString());
                    this.labelVersImgTxt.Text = "ve" + matchA.Groups["versionVe"].Value + "_vi" + matchA.Groups["versionVi"].Value;
    Bonsoir,
    Si VI et toujours un répertoire de VE, en reprenant le travail de Ph_Gr, il suffit de remplacer le "OU" par le séparateur des répertoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))\\(VI(?<versionVi>\d{2}))(?=\\)";
    A voir...

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 64
    Points : 47
    Points
    47
    Par défaut
    Bonjour chrismonoye,

    ca marche très bien, j ai essayé de mettre un autre groupe "name", bien sur ca ne fonctionne pas, et je ne vois pas mon erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))\\(VI(?<versionVi>\d{2}))\\((?<name>.wim))(?=\\)";

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                string fileName = "D:\\MDT_REFERENTIEL\\Systeme d'exploitation\\Socle\\VE01\\VI09\\toto2.wim";
                string pattern = @"(?<=\\)(VE(?<versionVe>\d{2}))\\(VI(?<versionVi>\d{2}))\\(?<name>.+\.wim)";
                Match matchA = new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Match(fileName);
                this.labelVersImgTxt.Text = "ve" + matchA.Groups["versionVe"].Value + "_vi" + matchA.Groups["versionVi"].Value+"_" + matchA.Groups["name"].Value;
    devrait fonctionner.

    Il faut déjà virer le (?=\\) final car cela veut dire que vous attendez que votre recherche soit suivi obligatoirement d’une barre oblique inverse comme l’a expliqué Ph_Gr .
    Ce qui n’est pas le cas dans une fin de chemin de fichiers.
    Ensuite le groupe nommé name, sauf erreur, attend un nom suivi de son extension.
    Le nom = .+ une chaine de 1 ou plusieurs n'importe quel caractère( sauf la fin de ligne).
    Le . de l’extension = \. (à échapper pour l’avoir au sens littéral).
    Et sa suite qui est toujours = wim.

    Là un des meilleurs tutoriels sur les expressions régulières.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] [Expression][Régulière] motif
    Par Cyspak dans le forum Langage
    Réponses: 4
    Dernier message: 23/09/2003, 14h24
  2. [langage] [debutant] expression reguliere
    Par toto_titi dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2003, 09h45
  3. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

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