Modifier des noms avec une expression régulière [Résolu]

topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 15 juil. 2014 à 17:08 - Dernière réponse : topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention
- 21 juil. 2014 à 14:22
Bonjour,
Ma question concerne les expressions régulières.

Je cherche a modifier des noms (de répertoires et ou fichiers) de la manière suivante :
- Supprimer tout les espaces potentiels, quelque soit leur position (début, milieu et fin de chaîne),
- Mettre toutes les lettres en majuscule au cas ou ce ne serait pas le cas.

J'ai commencer à plancher sur les expressions régulières, mais je ne trouve pas comment faire cela en une seule fois bien qu'il me semble que ce soit possible?

Peut-on en même temps tester si le premier caractère, espace omis au cas ou, est un S ou s?

J'utilise : RegEx.Pattern = "[a-z]|\s+" pour trouver les minuscule et les espaces, cela fonctionne bien, mais c'est la suite sur laquelle je butte ...

Pouvez vous m'aider?
Un grand merci d'avance.
Afficher la suite 

Votre réponse

10 réponses

Whismeril 11966 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 août 2018 Dernière intervention - 15 juil. 2014 à 17:40
0
Merci
Bonsoir, je ne connais pas VB script, mais en VB6 ou VB.Net, il y a la fonction Replace avec laquelle tu remplace un caractère par un autre ou par rien quelque soit sa position.
Il y a aussi ToUpper pour mettre en majuscule.
Je pense que ça marche aussi en VBScript

Pas besoin de Regex.
Commenter la réponse de Whismeril
topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 15 juil. 2014 à 17:49
0
Merci
Bonjour Whismeril,

Tu as tout as fait raison, Replace existe en VBS ainsi que Ucase.

En fait l'idée est de faire cela en une seule instruction, et seulement pour les nom qui en on besoin.

Il me semble alors qu'une RegEx serait plus efficace et rapide?

Merci pour ta réponse
Commenter la réponse de topor
Whismeril 11966 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 août 2018 Dernière intervention - 15 juil. 2014 à 20:12
0
Merci
Dans ce cas oui probablement, mais il faut être précis dans ta demande, quels sont exactement les critères qui vont faire que la majuscule sera appliquée ou qu'un espace sera supprimé?
Commenter la réponse de Whismeril
topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 16 juil. 2014 à 08:24
0
Merci
Whismeril,

Les critères sont simples à mon avis: tous les caractères doivent être en majuscule et il ne doit y avoir aucun espace (ou que ce soit dans la chaîne).
Commenter la réponse de topor
Whismeril 11966 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 août 2018 Dernière intervention - 16 juil. 2014 à 10:03
0
Merci
Bonjour

ceci
seulement pour les nom qui en on besoin.
est en opposition avec cela
tous les caractères doivent être en majuscule et il ne doit y avoir aucun espace (ou que ce soit dans la chaîne).


Dans la premère phrase une regex peut être (et surement en deux ou trois étapes à voir), dans la seconde non.


Commenter la réponse de Whismeril
topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 16 juil. 2014 à 10:12
0
Merci
Re!
Merci de me consacrer du temps ... Je suis géologue et donc programmeur amateur et débutant!!!

N'est-il pas plus facile de tester tout les noms avec la RegEx.Pattern = "[a-z]|\s+" et de les traiter si elle trouve quelque chose?
J'ai testé cette forme de RegEx qui me trouve bien toutes les majuscule et les minuscule.
Ce que je n'arrive pas a faire c'est une RegEx qui supprimerais les blancs et mettrais les minuscule en majuscule.

J'arrive à le faire autrement, mais me demandais si ce ne serait pas plus rapide avec une RegEx???
Commenter la réponse de topor
Whismeril 11966 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 août 2018 Dernière intervention - 16 juil. 2014 à 11:14
0
Merci
N'est-il pas plus facile de tester tout les noms avec la RegEx.Pattern = "[a-z]|\s+" et de les traiter si elle trouve quelque chose?


Je ne pense pas, Ucase va te mettre le nom entier en majuscule d'un coup. Avec la Regex (même si on arrivait à l'ecrire en une seul ligne) tu cherches d'abord les minusules à l'unité, puis tu les remplaces par leur majuscule. En temps d'execution je pense que c'est plus long.

Pour les espaces il y a une méthode Replace dans les regex, mais quand on cherche à remplacer un caractere par un autre, là encore, tu dois d'abord creer ta Regex puis lancer le Replace. Ici la différence de temps doit etre minime, mais dans ton projet tu dois (juste pour une fonction qui existe déjà) ajouter une référence.

Alors que
Replace(monTexte," ","")
suffit

L'interet de la Regex est de faire des recherches "compliquées", par exemple remplacer des date au format yyyy-mm-dd par dd/mm/yyyy
Commenter la réponse de Whismeril
topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 16 juil. 2014 à 11:19
0
Merci
Merci pour tout.
Je crois que c'est ce que je vais faire, et utiliser la RegEx que pour trouver les noms qui doivent être traités.
Bien cordialement
Commenter la réponse de topor
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 juil. 2014 à 14:16
0
Merci
Bonjour à tous,

Comme le dit Whismeril, une combinaison "regex" et "replace" permet d'obtenir le résultat souhaité.

Ex:

Function MyRegEx(argString)
Dim RegEx, matches
Set RegEx = New RegExp
With RegEx
.IgnoreCase = False
.Global = True
.Pattern = "[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝ]"
Set matches = .Execute(argString)
End With
If matches.Count >= 0 Then
argString = Replace(UCase(argString), Space(1), Space(0))
Else
argString = Replace(argString, Space(1), Space(0))
End If
MyRegEx = argString
End Function

WScript.Echo "test1" & vbTab & MyRegEx(" aOÜt")
WScript.Echo "test2" & vbTab & MyRegEx("août ")
WScript.Echo "test3" & vbTab & MyRegEx("AO ÛT")
WScript.Echo "test4" & vbTab & MyRegEx("AOût")
WScript.Echo "test5" & vbTab & Len(MyRegEx(" aOÜt"))
WScript.Echo "test6" & vbTab & Len(MyRegEx("août "))
WScript.Echo "test7" & vbTab & Len(MyRegEx("AO ÛT"))
WScript.Echo "test8" & vbTab & Len(MyRegEx("AOût"))

jean-marc
Commenter la réponse de cs_JMO
topor 7 Messages postés mardi 15 juillet 2014Date d'inscription 14 avril 2015 Dernière intervention - 21 juil. 2014 à 14:22
0
Merci
Bonjour et merci à tous.

J'ai résolu mon problème de la manière suivante :

txt = "c:\ my fol  der\ my Fi le.txt  "

function repl(m,p,s)
' m = match reussi
' p = position
' s = texte reference
if m = " " then
txt = ""
else
txt=ucase(m)
end if
repl = txt
end function

set rx = New Regexp
With rx
.Pattern = "\s|[a-z]"
.Global = true
.IgnoreCase = false
End With

msgbox rx.Replace(txt, GetRef("repl"))

Cela me donne le résultat voulu.
Bien cordialement.
Commenter la réponse de topor

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.