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 :

Regexp Matches ignorer occurrence d'un caractère.


Sujet :

VBScript

  1. #1
    Invité
    Invité(e)
    Par défaut Regexp Matches ignorer occurrence d'un caractère.
    Bonjour,
    Sub btnMatchMinChars_OnClick me remonte le nombre d'occurrences minuscules trouvés dans MyTextArea.

    MyTextArea = "Il y a quoi ce soir à la TV".
    J'ai donc 15 occurrences soit: "l y a quoi ce soir la".

    J'aimerais ignorer les occurrences "y" et "a".
    Une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub btnMatchMinChars_OnClick
    	ValMinChars = "[a-z]"
    	strText = MyTextArea.Value
    	Set RegularExpressioN = New RegExp
    	RegularExpressioN.Pattern =  ValMinChars
    	RegularExpressioN.Global = True
    	Set matches = RegularExpressioN.Execute(strText)
    	If matches.Count > 0 Then
    		msg = "Found " & matches.Count & " matches:" & vbCRLF
    		MsgBox msg, 0, "VBScript Regular Expression Tester"
    	Else
    		MsgBox "No match", 0, "VBScript Regular Expression Tester"
    	End If
    End Sub

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    bonjour,
    étant précisé que "tes occurences minuscules" ne comprennent pas les caractères accentués...
    d'une façon plus générale, pourquoi ne pas prendre le temps de lire attentivement
    la rubrique de l'aide intitulée "introduction aux expressions régulières" ce qui t'éviterait de buter sur
    des questions aussi basiques
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ValMinChars = "([a-z])(?! a )(?! y )"
    MyTextArea = "Il y a quoi ce soir à la TV"     'ignorer | a | y |
    nombre d'occurrence: 13
    ______________________________________________________________________________________
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ValMinChars = "([a-z])(?! a )(?! y )(?! d')"     'ignorer | a | y | d'|
    MyTextArea = "Il y a quoi ce soir à la TV, rien d'intéressant"
    nombre d'occurrence: 27
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut

    omen999
    j'ai l'impression que ton reg "[b-xz]" élimine le a du la dans son expression "Il y a quoi ce soir à la TV"
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quelque chose m'échappe là!

    Nom : regexp.jpg
Affichages : 376
Taille : 76,2 Ko

  6. #6
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Citation Envoyé par NeriXs Voir le message
    Bonjour,
    Quelque chose m'échappe là!
    Nom : ImageRep.jpg
Affichages : 430
Taille : 146,2 Ko
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Invité
    Invité(e)
    Par défaut
    La méthode replace aurait du me remplacer toutes mes minuscules hormis «y», «a» et «d’» non?

    "I- y a ---- -- ---- à -- TV, ---- d'---é-------"

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le résultat n’est pas celui voulu !

    Nom : 1.jpg
Affichages : 452
Taille : 89,2 Ko

    Nbr.d'occurence: 27
    position: 6 Longueur: 1 Valeur: a
    SubMatches = ---|a|---
    position: 8 Longueur: 1 Valeur: q
    SubMatches = ---|q|---
    position: 9 Longueur: 1 Valeur: u
    SubMatches = ---|u|---
    position: 10 Longueur: 1 Valeur: o
    SubMatches = ---|o|---
    position: 11 Longueur: 1 Valeur: i
    SubMatches = ---|i|---
    position: 13 Longueur: 1 Valeur: c
    SubMatches = ---|c|---
    position: 14 Longueur: 1 Valeur: e
    SubMatches = ---|e|---
    position: 16 Longueur: 1 Valeur: s
    SubMatches = ---|s|---
    position: 17 Longueur: 1 Valeur: o
    SubMatches = ---|o|---
    position: 18 Longueur: 1 Valeur: i
    SubMatches = ---|i|---
    position: 19 Longueur: 1 Valeur: r
    SubMatches = ---|r|---
    position: 23 Longueur: 1 Valeur: l
    SubMatches = ---|l|---
    position: 24 Longueur: 1 Valeur: a
    SubMatches = ---|a|---
    position: 30 Longueur: 1 Valeur: r
    SubMatches = ---|r|---
    position: 31 Longueur: 1 Valeur: i
    SubMatches = ---|i|---
    position: 32 Longueur: 1 Valeur: e
    SubMatches = ---|e|---
    position: 35 Longueur: 1 Valeur: d
    SubMatches = ---|d|---
    position: 37 Longueur: 1 Valeur: i
    SubMatches = ---|i|---
    position: 38 Longueur: 1 Valeur: n
    SubMatches = ---|n|---
    position: 39 Longueur: 1 Valeur: t
    SubMatches = ---|t|---
    position: 41 Longueur: 1 Valeur: r
    SubMatches = ---|r|---
    position: 42 Longueur: 1 Valeur: e
    SubMatches = ---|e|---
    position: 43 Longueur: 1 Valeur: s
    SubMatches = ---|s|---
    position: 44 Longueur: 1 Valeur: s
    SubMatches = ---|s|---
    position: 45 Longueur: 1 Valeur: a
    SubMatches = ---|a|---
    position: 46 Longueur: 1 Valeur: n
    SubMatches = ---|n|---
    position: 47 Longueur: 1 Valeur: t
    SubMatches = ---|t|---

    Soit :
    a|quoi|ce|soir|la|rie|d|intressant

    Il manque le "l" de Il, le "n" de rien.
    Le "a" et le "d" sont présents, sans l’apostrophe.

    Je ne devrais pas plutôt avoir :
    l|quoi|ce|soir|la|rien|intressant

  9. #9
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    Salut,
    j'ai l'impression que ton reg "[b-xz]" élimine le a du la dans son expression "Il y a quoi ce soir à la TV"
    yep, la question initiale est ambigüe
    pour moi "une occurrence de a" implique également celles incluses dans un mot et non simplement isolées
    en réalité nous avons répondu à deux interprétations différentes de la même question
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  10. #10
    Invité
    Invité(e)
    Par défaut
    Pouvez-vous m’expliquer pourquoi le pattern "([a-z])(?! a )(?! y )" ne donne pas le résultat espéré? Sur la recherche des caractères "a" et "y" de mon exemple?

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par NeriXs Voir le message
    Pouvez-vous m’expliquer pourquoi le pattern "([a-z])(?! a )(?! y )" ne donne pas le résultat espéré? Sur la recherche des caractères "a" et "y" de mon exemple?
    Cette pattern est fausse car elle élimine les lettres suivies d'un "a" ou d'un "y" entourés d'espaces. Or ce que tu cherches, si j'ai bien compris, c'est à éliminer ces deux lettres lorsqu'elles sont isolées.

    Pour faire ça, il faut que les tests avant soient placés à la même position que le caractère qui va être éventuellement consommé: (?!\b[ay]\b)[a-z].

    Si maintenant le but du jeu est d'éviter n'importe quelle lettre isolée, tu peux le faire sans utiliser de test avant, juste en jouant avec les limites de mot (word-boundaries):[a-z]\B|\B[a-z]
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonsoir à tous,
    Merci CosmoKnacki, c’est exactement le pattern qu’il fallait.
    Quel pattern utiliserais tu pour isoler une ou plusieurs lettre minuscule unique dans un groupe de caractères?

    Exemples:
    Il va bien
    LabTxT
    sTrText

  13. #13
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Eh bien, ce n'est pas possible en vbscript, car si je ne m'abuse, ce langage ne supporte pas les tests arrière (?<!...) qui permettraient d'écrire simplement: (?<![a-z])[a-z](?![a-z]) soit (pas de minuscule avant, pas de minuscule après).

    La seule chose à faire est donc de ruser en décrivant et en consommant la position avant le caractère ciblé: ([^a-z]|^)[a-z](?![a-z]) (cette position peut être soit le début de la chaîne ^, soit un caractère qui n'est pas une lettre minuscule [^a-z]). Tout ce que ça change, c'est qu'éventuellement deux caractères seront consommés par la pattern (le caractère précédent et le caractère cible). Ça ne pose pas de problème s'il s'agit juste de compter le nombre de match. Par contre, si tu comptes faire un remplacement, tu devras mettre une référence au groupe de capture 1 dans la chaîne de remplacement pour restituer le caractère qui précède ton caractère cible.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Tout ce que ça change, c'est qu'éventuellement deux caractères seront consommés par la pattern (le caractère précédent et le caractère cible). Ça ne pose pas de problème s'il s'agit juste de compter le nombre de match. Par contre, si tu comptes faire un remplacement, tu devras mettre une référence au groupe de capture 1 dans la chaîne de remplacement pour restituer le caractère qui précède ton caractère cible.
    Je n'ai pas bien compris cette référence substitution "\1-"
    Un petit exemple VBS est possible ?

  15. #15
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Malheureusement, ça fait au moins dix ans que je n'ai plus Windows installé chez moi et je fais ça un peu de mémoire (sachant que j'ai utilisé très peu vbscript). Peut-être que le placeholder pour la capture dans la chaîne de remplacement est $1 au lieu de \1 (ça varie d'un langage à l'autre), je ne m'en rappelle plus.

    Quoi qu'il en soit, le principe est simple. Quand tu mets des parties de ta pattern entre parenthèses comme:La (famille) (Doucoeur) c'est la famille du (bonheur), tu définies des groupes de captures (1:famille, 2:Doucoeur, 3:bonheur). Ces sous-chaînes sont stockées indépendamment du résultat complet qui serait une sorte de groupe de capture 0:La famille Doucoeur c'est la famille du bonheur contenant l'intégralité de la correspondance.

    Dans le cadre d'un remplacement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set objRegEx = CreateObject("VBScript.RegExp")
     
    objRegEx.Pattern = "La (famille) (Doucoeur) c'est la famille du (bonheur)"
     
    strSearchString = "La famille Doucoeur c'est la famille du bonheur"
    strNewString = objRegEx.Replace(strSearchString,"$2-$1-$3")
     
    Wscript.Echo strNewString
    Ce qui devrait afficher: Doucoeur-famille-bonheur.

    Dans l'exemple précédent, ([^a-z]|^) capture le I de Il, donc pour ne pas l'effacer lors d'un remplacement, on écrit $1-.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  16. #16
    Invité
    Invité(e)
    Par défaut
    Parfait

    Merci pour l'exemple et surtout l'explication.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Comme conseillé, j'ai mis en référence mon groupe de capture 1 dans ma chaîne de remplacement pour restituer le caractère qui précède mon caractère cible.
    Le remplacement est OK
    J'aimerais faire en sorte que les informations match soient en adéquations avec mes caractères de remplacements.
    Explication:

    Actuellement j'ai:
    6 correspondance(s) trouvée(s).
    Correspondance trouvée "Il" en position: 0
    Correspondance trouvée " y" en position: 2
    Correspondance trouvée " a" en position: 4
    Correspondance trouvée " s" en position: 7
    Correspondance trouvée "Tr" en position: 9
    Correspondance trouvée "Tx" en position: 20

    Et j'aimerais:
    6 correspondance(s) trouvée(s).
    Correspondance trouvée "l" en position: 1
    Correspondance trouvée "y" en position: 3
    Correspondance trouvée "a" en position: 5
    Correspondance trouvée "s" en position: 8
    Correspondance trouvée "r" en position: 10
    Correspondance trouvée "x" en position: 21

    Auriez-vous une idée ?
    J’avais pensé a quelque chose comme "match.chaine1.value", mais ce n’est pas géré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
     
    Dim TxtSource, TxtReslutCharsMinChars, strText, RegularExpressioN
    Dim FindCharsMinChars, SubstitCharsMinChars, matches, MatchMsg, match, ResultMsg
     
    TxtSource = "Il y a. sTrText. LabTxT."
    TxtReslutCharsMinChars = ""	
     
    FindCharsMinChars = "([^a-z]|^)[a-z](?![a-z])" 
    SubstitCharsMinChars = "-"
     
    strText = TxtSource		
    Set RegularExpressioN = New RegExp
    RegularExpressioN.Pattern = FindCharsMinChars
    RegularExpressioN.Global = True
    	Set matches = RegularExpressioN.Execute(strText)
    		If matches.Count > 0 Then		  
    		    MatchMsg = matches.Count & " correspondance(s) trouvée(s)." & vbCRLF
    		    	For Each match In Matches
    		      		MatchMsg = MatchMsg & "Correspondance trouvée """ & match.Value & """ en position: " & match.FirstIndex & vbCrLf
    		    	Next
    		    'MsgBox MatchMsg
    		Else
    		    MsgBox "Aucune correspondance trouvée  ", 0, "VBScript RegExp Tester"
    		End If		  										
    strText = RegularExpressioN.Replace(strText, "$1" & SubstitCharsMinChars)
    Set RegularExpressioN = Nothing
    TxtReslutCharsMinChars = strText
    ResultMsg = TxtReslutCharsMinChars
     
    MsgBox TxtSource & vbCrLf & ResultMsg & vbCrLf & MatchMsg

  18. #18
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Malheureusement en VBScript l'objet Match ne contient que la position du match complet et pas la position des groupes de captures, donc inutile de changer la pattern en ([^a-z]|^)([a-z])(?![a-z]) en espérant obtenir la position du groupe de capture 2 comme on pourrait le faire avec VB.net ou d'autres langages. La seule solution est la déduction, on a la position de la correspondance ainsi que le groupe de capture 1, donc la position de la lettre est position correspondance + taille capture groupe 1 ou encore position correspondance + taille correspondance - 1. Il n'y a pas d'autre moyens (reférence).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je parviens à récupérer la bonne position des mes caractères, mais pour ce qui de la valeur !
    Je suis dépassé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MatchMsg = MatchMsg & "Correspondance trouvée """ & match.Value & """ en position: " & CStr(match.FirstIndex + 1) & vbCrLf
    Un peu d’aide SVP ?

  20. #20
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    match.FirstIndex + 1: c'est faux! Prend par exemple un chaîne qui commence par une lettre isolée (a bon chat bon rat), ça te renverra 1 au lieu de 0. J'ai pourtant donné deux manières de trouver la position de la lettre:match.FirstIndex + Len(match.SubMatches(0)) ou match.FirstIndex + Len(match.Value) - 1.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/09/2017, 22h15
  2. regexp : toutes les occurrences
    Par dev_KooK dans le forum Langage
    Réponses: 6
    Dernier message: 05/03/2009, 14h16
  3. Réponses: 2
    Dernier message: 18/04/2008, 16h19
  4. Réponses: 2
    Dernier message: 04/11/2007, 11h12
  5. regExp:match non déclaré
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 10/04/2006, 11h10

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