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

10 réponses

1 2 3 4 5
Avatar
Clément Marcotte
Bonjour,

je pense qu'il est inexact de mettre une majuscule à la particule
"de"...


Je le pense aussi. C'est pour cela que je parle de paresse. :-))

Avatar
Clément Marcotte
Bonjour,

Si tu es intéressé, fais-moi signe et je copierai une version qui
fait un seul

appel à RE.Execute (le pattern est à l'avenant, mais j'ai annoncé
mes

couleurs...) et qui traite les O'Connor et McDonald avec respect :-)
Elle utilise aussi un peu les SubMatches; un aspect intéressant dans
le

traitement des expressions régulières.


Je ne dis pas non. J'aimerais justement pouvoir passer à "la première
école", mais je me retrouve toujours en chicane avec les Patterns, et
je perds patience. Je me dis alors que vaut mieux un programme "qui
marche" que rien du tout.

P.S. Tu pourrais même le déposer sur http://www.cjoint.com

Avatar
Daniel.M
On est chanceux Éric: il nous a épargné la version plus ... hard (mais je pense
qu'il n'en pensait pas moins).

Salutations,

Daniel M.

"Eric" wrote in message
news:
"jps" écrivait

et quand notre québécois saura qu'en mettant seulement "jps"
en A1, sa Function m'a retourné "Jean Paul Sabatier Des Granges Basses
De Chatillon D'Azergues En Beaujolais MVP HS"...
ça correspond très exactement au tatouage que j'ai sur le torse : en
position de repos, c'est "jps" et quand je gonfle mes pectoraux, c'est
ce que la Function m'a retourné....



Ah grand Age, quand tu nous tiens !!!
Suis pas sûr que les pectoraux gonflent encore ... mais la voix
rocailleuse, apparemment à lire le NG ;-))

Amicalement

Un autre papy

Eric



Avatar
Clément Marcotte
Bonjour,

Ne t'inquiète pas, je ne te prenais
pas pour un débutant dans Excel.


Je ne pensais pas cela. C'était plus pour l'amusement qu'autre chose.
Et Daniel a pensé à des noms auxquels je n'avais pas pensé.

Avatar
Daniel.M
Salut,

La fonction étant relativement courte, je la copie ici.
Ça donnerait quelque chose comme ce qui suit. Les instructions à l'intérieur de
la boucle auraient pu se limiter à une seule copie mais je voulais traiter
McDonald (qui introduisait l'utilisation des SubMatches). De plus, j'ai intégré
(mais pas beaucoup testé) une modif pour empêcher "de" d'être changé en "De".

'Met en majuscule la première lettre des mots de la cellule
'sauf le "de" : un caprice de JPS
'
Function PremLettre(LeTexte As String) As String

Dim RE As Object, Matches As Object, Match As Object
Dim s As String

Set RE = New RegExp
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' un espace, un apostrophe, un tiret ou rien
' PUIS
' une suite de lettres reconnues
RE.Pattern = "(s|'|-|)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte) ' le seul appel

For Each Match In Matches
s = Match.SubMatches(1)
If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
Mid(LeTexte, Match.FirstIndex + 1 + Len(Match.SubMatches(0)) + 2, 1) = _
UCase(Mid(LeTexte, Match.FirstIndex + 1 + _
Len(Match.SubMatches(0)) + 2, 1))
End If
If Left(s, 2) <> "de" Or Len(s) <> 2 Then ' met 1 lettre en maj sauf si "de"
Mid(LeTexte, Match.FirstIndex + 1 + Len(Match.SubMatches(0)), 1) = _
UCase(Mid(LeTexte, Match.FirstIndex + 1 + _
Len(Match.SubMatches(0)), 1))
End If
Next Match

PremLettre = LeTexte
End Function


Je ne dis pas non. J'aimerais justement pouvoir passer à "la première
école", mais je me retrouve toujours en chicane avec les Patterns, et
je perds patience. Je me dis alors que vaut mieux un programme "qui
marche" que rien du tout.



Avatar
jps
:-))))))
jps

"Eric" a écrit dans le message de
news:
"jps" écrivait

et quand notre québécois saura qu'en mettant seulement "jps"
en A1, sa Function m'a retourné "Jean Paul Sabatier Des Granges Basses
De Chatillon D'Azergues En Beaujolais MVP HS"...
ça correspond très exactement au tatouage que j'ai sur le torse : en
position de repos, c'est "jps" et quand je gonfle mes pectoraux, c'est
ce que la Function m'a retourné....



Ah grand Age, quand tu nous tiens !!!
Suis pas sûr que les pectoraux gonflent encore ... mais la voix
rocailleuse, apparemment à lire le NG ;-))

Amicalement

Un autre papy

Eric



Avatar
jps
te absolvo, clémentus rex quebecorum
jps

"Clément Marcotte" a écrit dans le message
de news:
Bonjour,

waouh!!! merci daniel
pourrait quand même le dire ce joalvert de clément.....
en tous cas, une fois cette références cochée (mais que j'aurais
bien été

incapable d'aller chercher tout seul), c'est une affaire qui
tourne...


Mille excuses, j'ai oublié.




Avatar
Clément Marcotte
Bonjour,

Merci.

'Met en majuscule la première lettre des mots de la cellule
'sauf le "de" : un caprice de JPS


Là, cela lui donne un avantage sur nompropre ;-)

Avatar
jps
dès que tu tends une perche (et le mot n'est pas utilisé au hasard) tu peux
être sûr qu'il y aura toujours un lubrique pour s'en saisir....
sacré daniel, tu les connais toutes, de la version "première communion 1.0"
à celle "corps de garde 6.9"
jps

"Daniel.M" a écrit dans le message de
news:
On est chanceux Éric: il nous a épargné la version plus ... hard (mais je
pense

qu'il n'en pensait pas moins).

Salutations,

Daniel M.

"Eric" wrote in message
news:
"jps" écrivait

et quand notre québécois saura qu'en mettant seulement "jps"
en A1, sa Function m'a retourné "Jean Paul Sabatier Des Granges Basses
De Chatillon D'Azergues En Beaujolais MVP HS"...
ça correspond très exactement au tatouage que j'ai sur le torse : en
position de repos, c'est "jps" et quand je gonfle mes pectoraux, c'est
ce que la Function m'a retourné....



Ah grand Age, quand tu nous tiens !!!
Suis pas sûr que les pectoraux gonflent encore ... mais la voix
rocailleuse, apparemment à lire le NG ;-))

Amicalement

Un autre papy

Eric







Avatar
jps
chapeau, daniel
et je suis content d'avoir fait mon caprice, même si je ne suis pas allé
jusqu'à faire pipi dans le VBE et me rouler dans le module...
jps

"Daniel.M" a écrit dans le message de
news:
Salut,

La fonction étant relativement courte, je la copie ici.
Ça donnerait quelque chose comme ce qui suit. Les instructions à
l'intérieur de

la boucle auraient pu se limiter à une seule copie mais je voulais traiter
McDonald (qui introduisait l'utilisation des SubMatches). De plus, j'ai
intégré

(mais pas beaucoup testé) une modif pour empêcher "de" d'être changé en
"De".


'Met en majuscule la première lettre des mots de la cellule
'sauf le "de" : un caprice de JPS
'
Function PremLettre(LeTexte As String) As String

Dim RE As Object, Matches As Object, Match As Object
Dim s As String

Set RE = New RegExp
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' un espace, un apostrophe, un tiret ou rien
' PUIS
' une suite de lettres reconnues
RE.Pattern = "(s|'|-|)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte) ' le seul appel

For Each Match In Matches
s = Match.SubMatches(1)
If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
Mid(LeTexte, Match.FirstIndex + 1 + Len(Match.SubMatches(0)) + 2,
1) = _

UCase(Mid(LeTexte, Match.FirstIndex + 1 + _
Len(Match.SubMatches(0)) + 2, 1))
End If
If Left(s, 2) <> "de" Or Len(s) <> 2 Then ' met 1 lettre en maj sauf
si "de"

Mid(LeTexte, Match.FirstIndex + 1 + Len(Match.SubMatches(0)), 1) _
UCase(Mid(LeTexte, Match.FirstIndex + 1 + _
Len(Match.SubMatches(0)), 1))
End If
Next Match

PremLettre = LeTexte
End Function


Je ne dis pas non. J'aimerais justement pouvoir passer à "la première
école", mais je me retrouve toujours en chicane avec les Patterns, et
je perds patience. Je me dis alors que vaut mieux un programme "qui
marche" que rien du tout.







1 2 3 4 5