PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Expressions régulières, regex, cherche et remplace
Expressions régulières, regex, cherche et remplace
Débuté par Gabriel H., 30 avr. 2008 16:19 - 11 réponses
Posté le 30 avril 2008 - 16:19
Bonjour,

Si comme moi vous avez voulu chercher ou remplacer une chaine de caractère qui vérifie une expression régulière facilement, vous avez du vous rendre compte que l'unique fonction de Windev VérifieExpressionRégulière() ne vous est pas d'une grande utilité...

L'astuce est d'utiliser un objet RegExp du VBScript.

Je vous fais donc part de ces deux fonctions, l'une pour chercher et l'autre pour remplacer.
En espérant comme d'habitude que ça aidera au moins quelques développeurs windev !

----------------------------------------------------------

// Ne trouve que la première occurence correspondant à SearchPattern dans SourceString.
// Possibilité de l'adapter très facilement pour trouver toutes les occurences.

PROCEDURE PG_RegEx_Find(pr_ch_SourceString est une chaîne, pr_ch_SearchPattern est une chaîne)

regEx est un objet Automation "VBScript.RegExp"
ret est une chaîne
CurrentMatch est un objet Automation dynamique
CurrentMatches est un objet Automation dynamique

regEx>>Pattern = pr_ch_SearchPattern
regEx>>IgnoreCase = True
regEx>>Global = True
regEx>>MultiLine = True
CurrentMatches = regEx>>Execute(pr_ch_SourceString)

ret = ""
IF CurrentMatches>>Count >= 1 THEN
CurrentMatch = CurrentMatches>>item(0)
IF CurrentMatch>>SubMatches>>Count >= 1 THEN
ret = CurrentMatch>>SubMatches(0)
END
END
RENVOYER ret

----------------------------------------------------------

// Remplace toutes les occurences trouvées par SearchPattern
// dans SourceString par ReplacementString
// et renvoie la chaine ainsi modifiée

PROCEDURE PG_RegEx_Replace(pr_ch_SourceString est une chaîne, pr_ch_SearchPattern est une chaîne, pr_ch_ReplacementString est une chaîne)

regEx est un objet Automation "VBScript.RegExp"
retStr est une chaîne
regEx>>Pattern = pr_ch_SearchPattern
regEx>>IgnoreCase=True
regEx>>Global = True
regEx>>MultiLine = True
RENVOYER regEx>>Replace(pr_ch_SourceString, pr_ch_ReplacementString)
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 21 avril 2017 - 14:47
Coucou,

Vous avez une meilleur solution pour faire la même chose avec la Version 21 ?

Je sais , j détere les vieux dossier ... 2008 :p

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 04 juin 2017 - 05:47
r

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
irc.freenode.net - ##pcsoft
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 04 juin 2017 - 05:49
Coucou,

Pkoi la regex valide sur https://regex101.com/ et pas en WLanguage !?

J ai besoin d'une regex qui valide un CSV ... Mais pkoi sa fonctionne pas ?

J'espere vraimment que c moi qui est pas compris un truc, car la pour le coup j suis vraimment bloqué .....

J'ai vraimment besoin d'une regex ... et de passer par VérifieExpressionRégulière

_sRegex est une chaîne = [
(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
]
_sVerifie est une chaîne = "Toto,Tata,Titi,Leon"

SI VérifieExpressionRégulière(_sVerifie, _sRegex) ALORS
Trace("ok")
ELSE
Trace("Pas ok")
FIN


--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
irc.freenode.net - ##pcsoft
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 04 juin 2017 - 16:55
hello,
houla ton "pattern" d'expression régulière n'est pas des plus simples et cela ne m'étonne pas que VérifieExpressionRégulière n'arrive pas à le traiter car ce n'est pas le top. Même l'objet automation vbscript.regexp ne semble pas aimer non plus ton "pattern".
Une soluton possible c'est d'utiliser le regexp de dotnet. Celui-ci se trouve dans l'assemblage System dans le namespace System.Text.RegularExpressions
Voici un code à la louche pour traiter ton pattern austère :) :
_sRegex est une chaîne = [
(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
]
_sVerifie est une chaîne = "Toto,Tata,Titi,Leon"
x est un entier
MesMatches est un MatchCollection dynamique = Regex.Matches(_sVerifie,_sRegex)
// trace(MesMatches.count)
POUR TOUT elem DE MesMatches
Trace("full match : ",elem.value)
x = 0
POUR TOUT groupe DE elem.groups
Trace("Groupe ",x," : ", groupe.Value)
x++
FIN
FIN


voici le résultat :





le groupe 2 est peut-être ce que tu recherches.
Au fait quel est le but exact de ton expression régulière ?

--
Ami calmant, J.P
Message modifié, 04 juin 2017 - 16:57
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 05 juin 2017 - 07:15
Coucou,

Super simpas de ta pars ;)

Le but exact c de verifie que le format de la chaine est un CSV.

et ensuite j'utilise VérifieExpressionRégulière avec un tableau pour "split" les partie du CSV et acceder au different elements.

Je ferais un post plus tard pour expliquer ce que je suis entrain de finir comme program, sa pourais te faire marrer 2 minutes :p

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
irc.freenode.net - ##pcsoft
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 05 juin 2017 - 12:54
https://doc.pcsoft.fr/fr-FR/?3024032


// https://doc.pcsoft.fr/fr-FR/?3024032
// https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/95095-expressions-regulieres-regex-cherche-remplace/read.awp?lastview
// Assemblage : System
// Namespace : System.Text.RegularExpressions
// Greatz to @JurassicPork ;)
Procedure PUBLIC VérifieExpressionRégulière(_sValue est une chaîne, _sPatern est une chaîne, _arrSMatchs est un tableau de chaîne = Null): boolean
_pclMatchCollection est un MatchCollection dynamique = Regex.Matches(_sValue,_sPatern)
POUR TOUT _Match de _pclMatchCollection
Ajoute(_arrSMatchs, _Match.value)
POUR TOUT _Groups de _Match.groups
Ajoute(_arrSMatchs, _Groups.value)
FIN
FIN
// Summary
RENVOYER (_pclMatchCollection.Count > 0)


SI VérifieExpressionRégulière(_sVerifie, _sRegex, _arrS) ALORS
Trace("Match")
// _arrS
SINON
Trace("No Mach")
FIN


// https://doc.pcsoft.fr/fr-FR/?3024032
// https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/95095-expressions-regulieres-regex-cherche-remplace/read.awp?lastview
// Assemblage : System
// Namespace : System.Text.RegularExpressions
// Greatz to @JurassicPork ;)
Procedure PUBLIC VérifieExpressionRégulière(_sValue est une chaîne, _sPatern est une chaîne): boolean
_pclMatchCollection est un MatchCollection dynamique = Regex.Matches(_sValue,_sPatern)
// Summary
RENVOYER (_pclMatchCollection.Count > 0)


SI VérifieExpressionRégulière(_sVerifie, _sRegex) ALORS
Trace("Match")
SINON
Trace("No Mach")
FIN


Ami calmant :)

--
Charly CanDo.
Forg en Nouvelle-Zélande / Indonesia ;-) - In üs we trust
irc.freenode.net - ##pcsoft
Message modifié, 05 juin 2017 - 12:56
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 05 juin 2017 - 13:37
Désoler je sais pkoi j peut plus crée de nouveau sujet mais simplement y répondre ....
Au cas ou j post en follow ici, et j envoie un mail, mais pareil j cumule les enuis ... (c pas normal :s)

Coucou,

Décidement ... sa doit etre le changement de pays c pas possible, j vais de problem en problem :s


Premier test je me connect sans certificat :

SocketConnecteSSL(_sGUID, 5222, "xmpp.jp", ProtocoleSSL3, 5000)


Vous avez appelé la fonction SocketConnecteSSL.
Des erreurs de sécurité ont été détectées pendant la mise en place de la communication

----- Informations techniques -----

Projet : Primal

Appel WL :
Traitement de 'Clic sur BTN_SansNom2' (FIWD_Abacradabra.FIWD_Abacradabra.BTN_SansNom2), ligne 13, thread 0
Fonction 'SocketConnecteSSL', syntaxe 2

Que s'est-il passé ?
Des erreurs de sécurité ont été détectées pendant la mise en place de la communication

Code erreur : 101002
Niveau : erreur non fatale

Dump de l'erreur du module 'wd210com64.dll' (21.0.58.0).
Identifiant des informations détaillées (.err) : 101002
Informations de débogage :
ClientHandshakeLoop
pxDecryptData
Fonction (10,263)
Informations supplémentaires :
EIT_PILEWL :
Clic sur BTN_SansNom2 (FIWD_Abacradabra.FIWD_Abacradabra.BTN_SansNom2), ligne 13
EIT_DATEHEURE : 05/06/2017 18:18:36
EIT_TYPE_WDFILE : <8>
EIT_IDCODE : <18>


Deuxieme test je possé un certificat :
(CertificatSélecteur() est patch pour la mise a jour de windows 10)

MonCertificat est un Certificat

// Ouverture du sélecteur de certificat de Windows
MonCertificat = CertificatSélecteur()

// Annulation ou erreur
SI MonCertificat..Nom = "" ALORS
RETOUR
FIN

SocketConnecteSSL(_sGUID, 5222, "160.16.217.191", ProtocoleSSL3, 5000, MonCertificat)


Erreur à la ligne 13 du traitement Clic sur BTN_SansNom2.
Vous avez appelé la fonction SocketConnecteSSL.
Des erreurs de sécurité ont été détectées pendant la mise en place de la communication

Détail de l'erreur système :

No credentials are available in the security package
 (2148074254)

----- Informations techniques -----

Projet : Primal

Appel WL :
Traitement de 'Clic sur BTN_SansNom2' (FIWD_Abacradabra.FIWD_Abacradabra.BTN_SansNom2), ligne 13, thread 0
Fonction 'SocketConnecteSSL', syntaxe 3

Que s'est-il passé ?
Des erreurs de sécurité ont été détectées pendant la mise en place de la communication

Code erreur : 101002
Niveau : erreur non fatale

Code d'erreur système : -2146893042
Message d'erreur système :
No credentials are available in the security package

Dump de l'erreur du module 'wd210com64.dll' (21.0.58.0).
Identifiant des informations détaillées (.err) : 101002
Informations de débogage :
AcquireCredentialsHandle
__bSetupCredentials
bInitiateHandShake
Fonction (10,263)
Informations supplémentaires :
EIT_PILEWL :
Clic sur BTN_SansNom2 (FIWD_Abacradabra.FIWD_Abacradabra.BTN_SansNom2), ligne 13
EIT_DATEHEURE : 05/06/2017 18:27:21
EIT_TYPE_WDFILE : <8>
EIT_IDCODE : <18>


https://www.google.com/transparencyreport/https/ct/#domain=www.xmpp.jp&incl_exp=False&incl_sub=False
Et j'ai bien importer / verifié que le certificats et bon.


Ou alors j'ai pas compris ...

Merci d avance !

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
irc.freenode.net - ##pcsoft
Membre enregistré
129 messages
Popularité : +20 (20 votes)
Posté le 11 novembre 2020 - 14:28
Charly CANDO a écrit :
// Assemblage:System
// Namespace:System.Text.RegularExpressions
// Greatz to @JurassicPork ;)
Procedure PUBLICVérifieExpressionRégulière(_sValueest une chaîne,_sPaternest une chaîne,_arrSMatchsest un tableau de chaîne=Null):boolean
_pclMatchCollectionest unMatchCollection dynamique=Regex.Matches(_sValue,_sPatern)
POURTOUT_Matchde_pclMatchCollection
Ajoute(_arrSMatchs,_Match.value)
POURTOUT_Groupsde_Match.groups
Ajoute(_arrSMatchs,_Groups.value)
FIN
FIN
// Summary
RENVOYER(_pclMatchCollection.Count>0)

Bonjour,

Cette solution m'intéresse bcp, la fonction de base VérifieExpressionRégulière étant une plaie...

J'ai essayé d'intégrer l'assemblage .NET System.Text.RegularExpressions



je le voie bien dans le projet mais je n'arrive pas à le développer pour accéder à l'objet Regex

Suis à jour sur le framework .NET, j'arrive à accéder à d'autres composants, y a-t-il autre chose à faire ?

Merci pour vos réponses
Membre enregistré
283 messages
Popularité : +80 (92 votes)
Posté le 11 novembre 2020 - 15:40
Salut System.Text.RegularExpressions est un namespace de l'assemblage System, Pour pouvoir le manipuler tu dois inclures Sytem dans tes assemblages .Net
Sélectionne System dans ta liste des assemblages .Net

--
Les innocents sont toujours accusés à tord.
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 11 novembre 2020 - 15:40
hello,
qu'as-tu importé comme assemblage ? quelle dll ?
Parce que System.Text.RegularExpressions se trouve dans l'assemblage System
// Assemblage : System
// Namespace : System.Text.RegularExpressions


dans ta copie d'écran on ne voit pas System et toute son arborescence

--
Ami calmant, J.P
Membre enregistré
129 messages
Popularité : +20 (20 votes)
Posté le 11 novembre 2020 - 20:32
Salut,

Effectivement j'avais importé la dll System.Text.RegularExpressions.dll et non System.dll

J'ai bien accès au Regex et ça fonctionne impeccable, merci !!