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

VBScript Discussion :

Expression régulière (prise de tête)


Sujet :

VBScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut Expression régulière (prise de tête)
    Bonjour

    J'ai un problème avec les expressions régulières

    Je dois analyser de nombreux fichiers et y retirer des informations. Je passe le fichier (format Txt d'origine) dans une variable, puis j'y passe mes différentes recherches

    J'ai des cas simples où je récupère une ligne (et une seule) qui commence toujours par certains caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="\nQTX\s.*"  ' retourne toute ligne commencant par QTX, suivit d'un espace puis le reste de la ligne
    jusque là j'ai pas de soucis.

    Par contre j'ai 2 cas où je dois récupérer une ligne commencant par certains caractères, mais aussi les suivantes jusqu'a rencontrer un autre ensemble de caractères et m'y arréter.

    Un exemple du contenu du fichier (bidon, c'est pour illustrer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    QTX MACHINE358
     
    PTH 1.5986
    ARG818,ARG750
    ARG3, TSS8
    13:15:56
    END
     
    NVX 0.236598,1235.2,456.3
    8.03,55.963,0.8896
    END
    ...
    Le shéma suivant me retourne toute les infos, mais naturellement jusqu'à la fin du fichier texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="\nPTH\s.+(\n.+)*"
    Si j'utilise cette notation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="\nPTH\s.+(\n.+)*\nEND"
    Celà va marcher UNIQUEMENT si il n'y a qu'un seul END dans le fichier, mais il arrive qu'il y en ai plusieurs (comme dans l'exemple plus haut), et dans ce cas il s'arrète au dernier END (ce qui me fausse tout)

    Ma question est : Comment lui dire de s'arréter dès qu'il rencontre une ligne commençant par "\nEND". En gros s'arréter à la première occurence trouvé pour ce mot clé

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut,

    Je n'ai pas d'ordi sous la main pour tester mais essayes ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PTH\s(?:(?!END)[\S\s])+
    EDIT:

    en activant le mode Multiline tu peux utiliser forcer le moteur a ne commencer le match qu'au debut de chaque ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ^PTH\s(?:(?!END)[\S\s])+

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    J'ai des cas simples où je récupère une ligne (et une seule) qui commence toujours par certains caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="\nQTX\s.*"  ' retourne toute ligne commencant par QTX, suivit d'un espace puis le reste de la ligne
    jusque là j'ai pas de soucis.
    Là c'est déjà oui ou non. Le problème c'est qu'il ne faut pas QTX... se paraître au début de la première ligne. Pour faire garder de ça, on peut le l'améliorer comme ça, et débarasser à la fois \n dans les matches en même temps comme bonus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="(?:(^|\n))QTX\s.*"
    Dans le même esprit, on peut donc faire ça pour les cas PTH.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="(?:(^|\n))(PTH\s[\s\S]*?)(?=\r\nEND)"
    Et c'est pour un fichier préparé avec des nouvelles lignes style windows, sinon, il faut tenir compter en modifiant un peu.

  4. #4
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Citation Envoyé par tsuji Voir le message
    Là c'est déjà oui ou non. Le problème c'est qu'il ne faut pas QTX... se paraître au début de la première ligne. Pour faire garder de ça, on peut le l'améliorer comme ça, et débarasser à la fois \n dans les matches en même temps comme bonus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="(?:(^|\n))QTX\s.*"
    Dans le même esprit, on peut donc faire ça pour les cas PTH.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele="(?:(^|\n))(PTH\s[\s\S]*?)(?=\r\nEND)"
    Et c'est pour un fichier préparé avec des nouvelles lignes style windows, sinon, il faut tenir compter en modifiant un peu.

    salut,

    +1 tu peux simplifier l'expression en:

    en activant explicitement le mode multiline.

    Citation Envoyé par tsuji Voir le message
    et débarasser à la fois \n dans les matches en même temps comme bonus.
    je ne voix pas l'interet

  5. #5
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    je ne voix pas l'interet
    lol ! c'est juste tout petit peu, penses pas ?! merci.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Messieurs, merci (et un grand)

    J'ai fini (enfin) par trouver, avec votre aide, la bonne syntaxe pour cette RegEx

    Le problème était un peu plus épineux qu'exposé, car l'un des blocks n'était pas toujours présent dans les (nombreux) fichiers à analyser

    au final ca me donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele_PTH.pattern = "^PTH\s(?:(?!^NVX\s)(?:(?!^END\r)[\S\s]))+"
    Celà m'aura permis d'approcher les notions plus poussé (?!;?=, le rôle du ? apres un quantificateur, etc) des expressions régulières. Un outil puissant, mais vite prise de tête pour des cas alambiqués ^^

  7. #7
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Juste encore une petite remarque si ce n'est pas tout à fait clair. Je mets la partie NVX à coté pour simplifier la chose.

    La différence entre
    et
    est principalement que la première expression trouve le bloc (PTH...) dans le cas même sans un stoppeur ^END\r, donc, c'est possible, jusqu'à la fin du fichier, tandis que la dernière enforce le stopper ^END\r et ne permet pas de matcher sans.

    Volià !

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

Discussions similaires

  1. [WD-2007] [Regex] Prise en compte du retour chariot dans une expression régulière
    Par MyKroPhone dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/08/2014, 14h15
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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