RegExp récupérer Submatches ? [Résolu]

NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 13 déc. 2017 à 21:39 - Dernière réponse : Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention
- 18 déc. 2017 à 13:44
Bonjour,
Je bute sur la récupération des Submatches des (groups) de mon pattern.
J’espère que ce que j’essaie de faire est réalisable?
Pouvez-vous m’aider?

TxtSource = "\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///"
ReslutSpeciChars = ""

Dim strText, RegularExpressioN

'([^\,]|^)([\,])(?![\,])
'[^\,] = n'est pas une virgule.
'| = ou.
'^ = est au début de la chaîne.
'(?![\,]) = n'est pas suivit d'une virgule.
'Equivalent a (?<![\,])[\,](?![\,]) soit (pas de virgule avant, pas de virgule après), mais non supporter par vb (test arrière (?<!....).

'"\" =([^\\]|^)([\\])(?![\\])
'"/" =([^\/]|^)([\/])(?![\/])
'"*" =([^\*]|^)([\*])(?![\*])

FindSpeciChars = "([^\\]|^)([\\])(?![\\])"_
& "|([^\/]|^)([\/])(?![\/])"_
& "|([^\*]|^)([\*])(?![\*])"

strText = TxtSource
Set RegularExpressioN = New RegExp
RegularExpressioN.Pattern = FindSpeciChars
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.Submatches(1) & """ en position: " & match.FirstIndex + Len(match.SubMatches(0)) & vbCrLf
Next
'MsgBox MatchMsg
Else
MsgBox "Aucun match", 0, "VBScript RegExp Tester"
End If
strText = RegularExpressioN.Replace(strText, "$&")'"$1" "$&"
Set RegularExpressioN = Nothing
ReslutSpeciChars = strText

MsgBox TxtSource & vbCrLf & ReslutSpeciChars & vbCrLf & MatchMsg
Afficher la suite 

42 réponses

Répondre au sujet
jordane45 19611 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 janvier 2018 Dernière intervention - 13 déc. 2017 à 22:40
0
Utile
Bonjour,
Ton pattern ne semble pas bon.
Commence par le tester en ligne, par exemple ici : http://regexstorm.net/tester
Sinon.. décris nous exactement ce que tu espères obtenir.

Commenter la réponse de jordane45
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 13 déc. 2017 à 23:33
0
Utile
Bonjour,
Mon pattern est bon :

([^\\]|^)([\\])(?![\\])|([^\/]|^)([\/])(?![\/])|([^\*]|^)([\*])(?![\*])

Prenons l’exemple avec le caractère ",".
Normalement j’aurais du utiliser ce pattern : (?<![\,])[\,](?![\,]) soit (pas de virgule avant, pas de virgule après).
Vu que le langage VBScript ne supporte pas les tests arrière (?<!…), il a fallu ruser, en décrivant et en consommant la position avant le caractère ciblé: ([^\,]|^)([\,])(?![\,]) (cette position peut être soit le début de la chaîne ^, soit un caractère qui n'est pas une virgule [^\,]). Ce qui change, c'est que deux caractères sont consommés par la pattern (le caractère précédent et le caractère cible).
Pour le remplacement, il est nécessaire de mettre une référence au groupe de capture dans la chaîne de remplacement pour restituer le caractère qui précède le caractère cible.
Le code fonctionne bien avec mon première caractère "\" soit le pattern: ([^\\]|^)([\\])(?![\\]) mais des que je veux traiter les deux autres !!!(groupes séparés par "|").

Je bute sur la manière d’adapter mes matches pour le value et la position de mes caractères.
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - Modifié par NeriXs le 14/12/2017 à 00:11
0
Utile
Voici le test qui fonctionne :

Référence au groupe de capture "$1".

"$&" est sensé reprendre tous les groupes de capture pour la suite.

TxtSource = "\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///"
ReslutSpeciChars = ""

Dim strText, RegularExpressioN

'([^\,]|^)([\,])(?![\,])
'[^\,] = n'est pas une virgule.
'| = ou.
'^ = est au début de la chaîne.
'(?![\,]) = n'est pas suivit d'une virgule.
'Equivalent a (?<![\,])[\,](?![\,]) soit (pas de virgule avant, pas de virgule après), mais non supporter par vb (test arrière (?<!....).

'"\" =([^\\]|^)([\\])(?![\\])
'"/" =([^\/]|^)([\/])(?![\/])
'"*" =([^\*]|^)([\*])(?![\*])

FindSpeciChars = "([^\\]|^)([\\])(?![\\])"

strText = TxtSource
Set RegularExpressioN = New RegExp
RegularExpressioN.Pattern = FindSpeciChars
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.Submatches(1) & """ en position: " & match.FirstIndex + Len(match.SubMatches(0)) & vbCrLf
Next
'MsgBox MatchMsg
Else
MsgBox "Aucun match", 0, "VBScript RegExp Tester"
End If
strText = RegularExpressioN.Replace(strText, "$&")
Set RegularExpressioN = Nothing
ReslutSpeciChars = strText

MsgBox TxtSource & vbCrLf & ReslutSpeciChars & vbCrLf & MatchMsg
Commenter la réponse de NeriXs
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 00:01
0
Utile
Bonsoir,

Peux tu mettre le resultat que tu attends à partir du texte que tu as mis en exemple?
Commenter la réponse de Whismeril
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 00:03
0
Utile
Le bute est de récupérer les caractères isolés .
Commenter la réponse de NeriXs
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 00:14
0
Utile
5
C’est pas clair, j’ai mis ton code « qui marche » dans regexstorm, et ça capture un anti slash coincé entre un espace et une étoile. C’est pas ce que j’appellerais isolé.
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 00:22
Attention j'ai corrigé mon exemple qui fonctionne sûrement entre temps. ds le replace j'ai remplacé "$1" par "$&"
Quand je dis isolé c'est isolé d'un groupe de caractères identiques.
Le résultat du MsgBox est :
1 correspondance(s) trouvé(s).
Correspondance trouvée "\" en position: 49
Ce qui est exacte.
As tu vu l'explication poste 2?
match.Submatches(1) me supprime l’espace avant le caractère et me le retourne.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 07:14
Avant de supprimer et de remplacer,n je voudrais comprendre ce que tu cherches à capturer.
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 09:57
Dans l'exemple du poste n°3 je recherche la ou les occurrences "\" qui ne font pas partie d'un groupe "\\\".
Pour le pattern utilisé voir explication du poste n°2.
Explication supplémentaire:
Caractères spéciaux
(\#) Correspond au caractère (#) suivant le backslash (exceptés les caractères a-z et 0-9).
Par exemple, la séquence "\\" signifie "\" , "\." correspond au caractère "." (stop), "\$" correspond à "$".
jordane45 19611 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 janvier 2018 Dernière intervention > NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 10:32
Bonjour,
Whismeril ne te demande pas de lui expliquer comment fonctionne une regex ni ce que sont les pattern que tu utilises...
Il veut (et il n'est pas le seul...) savoir ce que tu souhaites EXACTEMENT obtenir en partant de ta phrase d'exemple de ton premier message......

En gros...
TxtSource = "\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///"

Resultat attendu : .................................... (remplir ici ! )

Merci.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention > NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 12:06
Comme le dit Jordane, je sais me servir des regex, c’est même un jeu que j’apprécie. Cependant dans ton cas, je n’arrive pas à faire le lien entre ce que tu expliques et les patterns que tu montres.
Commenter la réponse de Whismeril
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 12:13
0
Utile
8
Le résultat du remplacement attendu n'est pas visible vu que je remplace le caractère par lui-même.
J'ai besoin de ce remplacement pour la suite de mon programme.

Pour voir ce qui est trouvé ajouter des parenthèses autour du $& soit ($&) ce qui donne au replace pour les caractères "\","/" et "*".

TxtSource = \\(\*)-***(*/)Un test, Pourquoi faire? c'est fou ça!( \)****(-*)///
Jusque-là pas de problème le remplacement est bon.

C'est au niveau de la récupération de la valeur et de la position de de mes caractères que ça coince
En utilisant le pattern: ([^\\]|^)([\\])(?![\\]) pour le caractères "\" c'est bon le résultat du MsgBox est:
1 correspondance(s) trouvé(s).
Correspondance trouvée "\" en position: 49

Mais, dès que j'essaie un pattern avec les caractères "\"|"/"|"*".
([^\\]|^)([\\])(?![\\])|([^\/]|^)([\/])(?![\/])|([^\*]|^)([\*])(?![\*])

Le résultat est :
4 correspondance(s) trouvé(s).
Correspondance trouvée "" en position: 2
Correspondance trouvée "" en position: 8
Correspondance trouvée "\" en position: 49
Correspondance trouvée "" en position:54

J'aimerais avoir ceci:
4 correspondance(s) trouvé(s).
Correspondance trouvée "*" en position: 3
Correspondance trouvée "/" en position: 9
Correspondance trouvée "\" en position: 49
Correspondance trouvée "*" en position:55
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 14:21
En pariant que oui, regarde ce lien (non cliquable à cause d'un vieux bug du site)

http://regexstorm.net/tester?p=%28%28%3f%3cavant%3e%5b%5e%5c%5c%5d%29%28%3f%3ctoto%3e%5c%5c%29%28%3f%3capres%3e%5b%5e%5c%5c%5d%29%29%7c%28%28%3f%3cavant%3e%5b%5e%5c*%5d%29%28%3f%3ctoto%3e%5c*%29%28%3f%3capres%3e%5b%5e%5c*%5d%29%29%7c%28%28%3f%3cavant%3e%5b%5e%2f%5d%29%28%3f%3ctoto%3e%2f%29%28%3f%3capres%3e%5b%5e%2f%5d%29%29&i=%5c%5c%5c*-****%2fUn+test%2c+Pourquoi+faire%3f+c%27est+fou+%c3%a7a!+%5c****-*%2f%2f%2f&r=%24%7bavant%7d%7c%24%7bapres%7d
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 15:38
(?<avant>[^\\])(?<toto>\\)(?<apres>[^\\]))|((?<avant>[^\*])(?<toto>\*)(?<apres>[^\*]))|((?<avant>[^/])(?<toto>/)(?<apres>[^/]))


Error: Erreur de syntaxe dans l'expression régulière
Code: 800A1399
Source: Erreur d'exècution Microsoft VBScript
System: La ressource de cluster n'a pas pu êtrz créée dans le moniteur de resources spécifié.

Toujours ce problème de test arrière avec VBS?
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 15:47
Ben non y a pas de test arrière, mais il ne doit pas aimer les groupes avec noms.
Est ce qu’au moins, sur le site, le résultat est conforme à ce que tu veux?
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 14 déc. 2017 à 16:13
On dirait bien que oui vu la table sur regexstorm.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 14 déc. 2017 à 20:56
Et là?
Regarde aussi l'onglet "Content" pour voir le résultat du remplacement.
Pour l'exemple j'ai mis des |
http://regexstorm.net/tester?p=%28%28%5b%5e%5c%5c%5d%29%28%5c%5c%29%28%5b%5e%5c%5c%5d%29%29%7c%28%28%5b%5e%5c*%5d%29%28%5c*%29%28%5b%5e%5c*%5d%29%29%7c%28%28%5b%5e%2f%5d%29%28%2f%29%28%5b%5e%2f%5d%29%29&i=%5c%5c%5c*-****%2fUn+test%2c+Pourquoi+faire%3f+c%27est+fou+%c3%a7a!+%5c****-*%2f%2f%2f&r=%242%246%2410%7c%244%248%2412
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - Modifié par NeriXs le 14/12/2017 à 22:33
0
Utile
12
Sous vbs le résultat est identique au donnée de l’onglet Context de regexstorm:
\\\|-****|Un test, Pourquoi faire? c'est fou ça! |****-|///

Hâte de voir comment tu va traiter la suite, encore merci !
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 15 déc. 2017 à 12:23
et d'ailleurs quand je teste sur VBA (qui utilises les regex de VBS), ça ne capture que 5 textes, alors que regexstrom en prend 6
Sub Macro1()

 Dim pattern As String
 Dim texte As String
 pattern = "([^\\]|^)([\\])(?![\\])|([^\/]|^)([\/])(?![\/])|([^\*]|^)([\*])(?![\*])"
 texte = "\-\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///"
 
 Dim regex As VBScript_RegExp_55.RegExp
 Set regex = New VBScript_RegExp_55.RegExp
 regex.pattern = pattern
 regex.Global = True
 
 Dim match As VBScript_RegExp_55.match
 Dim matches As VBScript_RegExp_55.MatchCollection
 Set matches = regex.Execute(texte)
 Debug.Print matches.Count
 
 Dim sortie As String
 For Each match In matches
        For i = 1 To match.SubMatches.Count - 1 Step 2
            If Not (match.SubMatches(i) = "") Then
                Debug.Print ("Correspondance trouvée """ & match.SubMatches(i) & """ en position:" & match.FirstIndex + 1)
            End If
        Next i
 Next match
 
End Sub
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 15 déc. 2017 à 13:09
Tu es proche du bute!
Sous regexstorm j'ai bien 5 Correspondances!
2 "\"
2 "*"
1"/"
En plus ton code me remonte la bonne valeur.
Reste juste les positions qui pointent sur la position du caractère d'avant.
Sauf pour le 1er qui est bon vu qu'il n'y a pas de caractère devant.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention > NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 15 déc. 2017 à 13:33
Tu es proche du bute!
tu peux chercher un peu de ton coté quand même...

Pour les 6 correspondances, c'est parce que j'ai ajouté */ à la fin, mais je ne l'avais pas fait dans VBA, et là on voit que ton pattern, ne prend pas le / à la fin
http://regexstorm.net/tester?p=%28%28%5e%7c%5b%5e%5c%5c%5d%29%28%5c%5c%29%28%5b%5e%5c%5c%5d%7c%24%29%29%7c%28%28%5e%7c%5b%5e%5c*%5d%29%28%5c*%29%28%5b%5e%5c*%5d%29%7c%24%29%7c%28%28%5e%7c%5b%5e%2f%5d%29%28%2f%29%28%5b%5e%2f%5d%29%7c%24%29&i=%5c-%5c%5c%5c*-****%2fUn+test%2c+Pourquoi+faire%3f+c%27est+fou+%c3%a7a!+%5c****-*%2f%2f%2f*%2f&r=%242%246%2410%7c%244%248%2412


Reste juste les positions qui pointent sur la position du caractère d'avant.
Sauf pour le 1er qui est bon vu qu'il n'y a pas de caractère devant.
en bon codeur, le 1er index c'est 0... et j'ai pas pensé à la capture nulle

Sub Macro1()

 Dim pattern As String
 Dim texte As String
 pattern = "([^\\]|^)([\\])(?![\\])|([^\/]|^)([\/])(?![\/])|([^\*]|^)([\*])(?![\*])"
 texte = "\-\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///*/"
 
 Dim regex As VBScript_RegExp_55.RegExp
 Set regex = New VBScript_RegExp_55.RegExp
 regex.pattern = pattern
 regex.Global = True
 
 Dim match As VBScript_RegExp_55.match
 Dim matches As VBScript_RegExp_55.MatchCollection
 Set matches = regex.Execute(texte)
 Debug.Print matches.Count
 
 Dim sortie As String
 For Each match In matches
        For i = 1 To match.SubMatches.Count - 1 Step 2
            If Not (match.SubMatches(i) = "") Then
                Debug.Print ("Correspondance trouvée """ & match.SubMatches(i) & """ en position:" & Len(match.SubMatches(i - 1)) + match.FirstIndex + 1)
            End If
        Next i
 Next match
 
End Sub
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 15 déc. 2017 à 13:46
Ce qui est dommage, c'est que ceci est à la fois bien plus simple et en plus capture correctement le dernier/
http://regexstorm.net/tester?p=%28%28%5e%7c%5b%5e%5c%5c%5d%29%28%5c%5c%29%28%5b%5e%5c%5c%5d%7c%24%29%29%7c%28%28%5e%7c%5b%5e%5c*%5d%29%28%5c*%29%28%5b%5e%5c*%5d%29%7c%24%29%7c%28%28%5e%7c%5b%5e%2f%5d%29%28%2f%29%28%5b%5e%2f%5d%29%7c%24%29&i=%5c-%5c%5c%5c*-****%2fUn+test%2c+Pourquoi+faire%3f+c%27est+fou+%c3%a7a!+%5c****-*%2f%2f%2f*%2f&r=%242%246%2410%7c%244%248%2412
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention > Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 15 déc. 2017 à 18:20
Ha je n'avais pas copier le bon url....
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 15 déc. 2017 à 17:00
0
Utile
2
Voici la solution retenue en grand merci Whismeril

Sub Macro1()

Dim pattern As String
Dim texte As String
pattern = "([^\\]|^)([\\])(?![\\])|([^\/]|^)([\/])(?![\/])|([^\*]|^)([\*])(?![\*])|([^\-]|^)([\-])(?![\-])"
texte = "\-\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///*/"

Dim regex As VBScript_RegExp_55.RegExp
Set regex = New VBScript_RegExp_55.RegExp
regex.pattern = pattern
regex.Global = True

Dim match As VBScript_RegExp_55.match
Dim matches As VBScript_RegExp_55.MatchCollection
Set matches = regex.Execute(texte)
Debug.Print matches.Count

Dim sortie As String
For Each match In matches
For i = 1 To match.SubMatches.Count - 1 Step 2
If Not (match.SubMatches(i) = "") Then
Debug.Print ("Correspondance trouvée """ & match.Submatches(i) & """ en position: " & match.FirstIndex + Len(match.Value) - 1)
End If
Next i
Next match

End Sub


Je rencontre un nouveau problème!
Si deux caractères "seule" et côte à côte seule le 1er et prit en compte
/**** *\\/ Ok pour le 0 le 6 et le 9
/**** *\ Ok pour le 0 et le 6 mais pas le 7
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 15 déc. 2017 à 18:18
Là, je ne suis pas sûr, mais il me semble que c'est une limitation des regex: 2 captures ne se chevauchent pas.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 15 déc. 2017 à 18:23
Là ça marche
http://regexstorm.net/tester?p=%28%5b%5c%5c%5c*%2f-%5d%29%28%3f%3c!%5c1%5c1%29%28%3f!%5c1%29&i=%5c-%5c%5c%5c*-****%2fUn+test%2c+Pourquoi+faire%3f+c%27est+fou+%c3%a7a!+%5c****-*%2f%2f%2f*%2f&r=%7c

Mais ce pattern est refusé par VBS.

T'es obligé de faire du VBS, VB.Net accepte ce pattern
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - Modifié par NeriXs le 15/12/2017 à 23:53
0
Utile
1
Je dois dans la mesure du possible rester sous VBScript. Penses tu qu’il soit possible de traiter chaque "sous patterns" indépendamment ?
Dans une sorte de boucle et surtout récupérer chaque positions et valeurs?
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 16 déc. 2017 à 00:03
Oui
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 16 déc. 2017 à 14:13
0
Utile
1
N’étant pas très a mon aise, avec la gestion d’une boucle dans ce contexte de multiple sous pattern,
j’appréciais beaucoup qu’une personne expérimentée puisse me donner un exemple complet.
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 16 déc. 2017 à 21:32
Ceci marche sous VBA
Sub Macro1()
 Dim texte As String
 texte = "\-\\\*-****/Un test, Pourquoi faire? c'est fou ça! \****-*///*/"

 For Each Caractere In Array("\\", "\*", "-")
      Recherche Caractere, texte
 Next
End Sub


Sub Recherche(ByVal Caractere As String, texte As String)
 Dim Pattern As String
 Pattern = "([^" & Caractere & "]|^)(" & Caractere & ")(?!" & Caractere & ")" 'on fait un pattern

 Dim regex As VBScript_RegExp_55.RegExp
 Set regex = New VBScript_RegExp_55.RegExp
 regex.Pattern = Pattern
 regex.Global = True

 Dim match As VBScript_RegExp_55.match
 Dim matches As VBScript_RegExp_55.MatchCollection
 Set matches = regex.Execute(texte)
 Debug.Print "Le pattern " & Pattern & " retourne " & matches.Count; " captures"

 Dim sortie As String
 For Each match In matches
        For i = 1 To match.Submatches.Count - 1 Step 2
            If Not (match.Submatches(i) = "") Then
                Debug.Print ("Correspondance trouvée """ & match.Submatches(i) & """ en position: " & match.FirstIndex + Len(match.Value))
            End If
        Next i
 Next match

End Sub
Commenter la réponse de NeriXs
NeriXs 101 Messages postés lundi 4 mai 2015Date d'inscription 11 janvier 2018 Dernière intervention - 18 déc. 2017 à 13:31
0
Utile
1
Bonjour,
C'est impeccable! Merci
Juste une petite erreur.
Les caractères sont décalés de + 1.
Modification de la ligne 30
Debug.Print ("Correspondance trouvée """ & match.Submatches(i) & """ en position: " & match.FirstIndex + Len(match.Value) - 1)
Whismeril 10767 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 janvier 2018 Dernière intervention - 18 déc. 2017 à 13:44
Pense à marquer le sujet résolu, si ça te convient
Commenter la réponse de NeriXs

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.