Modifier des noms avec une expression régulière

Résolu
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015 - 15 juil. 2014 à 17:08
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015 - 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.

10 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
15 juil. 2014 à 17:40
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.
0
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015
15 juil. 2014 à 17:49
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
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
15 juil. 2014 à 20:12
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é?
0
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015
16 juil. 2014 à 08:24
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
16 juil. 2014 à 10:03
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.


0
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015
16 juil. 2014 à 10:12
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???
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
16 juil. 2014 à 11:14
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
0
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015
16 juil. 2014 à 11:19
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
21 juil. 2014 à 14:16
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
0
topor Messages postés 7 Date d'inscription mardi 15 juillet 2014 Statut Membre Dernière intervention 14 avril 2015
21 juil. 2014 à 14:22
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.
0
Rejoignez-nous