OVH Cloud OVH Cloud

Info - Un autre petit exercice avec des expressions régulières

53 réponses
Avatar
Clément Marcotte
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(\s\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function

3 réponses

2 3 4 5 6
Avatar
Daniel.M
Plaise au Roi !

puis-je faire remarquer à Votre Seigneurie que pour que ça marche chez moi
(XL 97 pour l'heure), il a fallu que je supprime les () dans Dim SansMaj...


J'ai non seulement supprimé les () mais le tableau SansMaj au complet!
L'ensemble du processus s'effectue maintenant au niveau du Pattern et de
l'exécution du moteur des expressions régulières : il y a un lien direct avec la
position défendue lors de mon tout premier message.

Ça donne ceci et ça remplace les deux versions (puisque le processus est intégré
dans le pattern):

Salutations,

Daniel M.

' Daniel Maher
' mpfe Novembre 2004
' Met en majuscule la première lettre des mots de la cellule
' sauf quelques mots (du, de, etc), un caprice de JPS et sa cour :-)
'
Function PremLettre(LeTexte As String) As String

Dim RE As Object, Matches As Object, UnMatch As Object
Dim decale As Integer

Set RE = CreateObject("VBScript.RegExp")
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' De 0 à plusieurs caractères suivants: espace ou apostrophe ou tiret
' puis OPTIONNELLEMENT
' un mot tel que du ou de ou d' ou des ou van ou ... etc
' puis OBLIGATOIREMENT
' soit mc, soit une suite de 1 à plusieurs lettres reconnues
RE.Pattern = "(((s|'|-)*)" & _
"((du|de|d|des|van|von|di|del)(s|'))?)" & _
"(mc|([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+))"

Set Matches = RE.Execute(LeTexte)

For Each UnMatch In Matches 'met 1 lettre du dernier mot en maj
decale = UnMatch.FirstIndex + 1 + Len(UnMatch.SubMatches(0))
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
Next UnMatch

PremLettre = LeTexte
Set Matches = Nothing: Set RE = Nothing

End Function

Avatar
jps
pauvre daniel, on t'aura usé jusqu'à la thread...
jps

"Daniel.M" a écrit dans le message de
news:%
Plaise au Roi !



Avatar
Clément Marcotte
Bonjour,

pauvre daniel, on t'aura usé jusqu'à la thread...
jps



:-))))))))))))))))))))

Mea culpa, mea culpa, mea maxima culpa :-)))))))))))))))))

2 3 4 5 6