Info - Un autre petit exercice avec des expressions régulières
53 réponses
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
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
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
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
jps
pauvre daniel, on t'aura usé jusqu'à la thread... jps
"Daniel.M" a écrit dans le message de news:%
Plaise au Roi !
pauvre daniel, on t'aura usé jusqu'à la thread...
jps
"Daniel.M" <prenom.maher@bigfoot.inutil.com> a écrit dans le message de
news:%23Q0ZmNv1EHA.2824@TK2MSFTNGP09.phx.gbl...