Je dois préciser en préambule que je travaille avec VB6 et RegExp.
J'essaie de trouver et de substituer des mots entiers. Par "mots entiers", j'entends qu'une correspondance valide n'est pas une sous-chaîne d'un autre mot, même si certains caractères spéciaux sont acceptés. Je suis un novice en matière d'expressions régulières. Voici ce que j'essayais de faire :
([^a-z]+)(Foo)([^a-z]+)
Il semble proche, mais j'ai des difficultés dans certaines situations.
Par exemple, si je trouve la chaîne
Foo Foo
o
Foo(Foo)
ou partout où une ligne se termine par Foo et où la ligne suivante commence par Foo
This is a line with Foo
Foo starts the next line
Dans tous ces cas, seul le premier Foo est mis en correspondance.
Eh bien, peut-être que ce n'est pas un problème avec le match mais plutôt avec ma méthode de remplacement. Je ne sais pas exactement comment je peux le vérifier. J'utilise des groupes pour remplacer le caractère de délimitation correspondant à l'expression, comme suit :
regEX.Replace(source, "$1" & newstring & "$3")
Donc, en résumé, je veux éviter la correspondance : FooBar BarFoo
Tous les éléments suivants sont des correspondances valables :
Foo Foo
Foo Bar
Foo_bar
Foo.bar
Foo, bar
Foo(bar)
Foo(Foo)
Si quelqu'un peut me montrer la bonne façon de procéder, je vous en serais reconnaissant !
édité
Il semble que j'ai parlé un peu trop tôt concernant la première solution ci-dessous. Après quelques tests et une lecture plus approfondie, j'ai constaté que l'underscore est un caractère de mot et donc que le motif ci-dessus ne correspond pas. J'ai trouvé cette solution qui fait l'affaire, y a-t-il une meilleure solution ?
(\b)(Foo)(\b|_)
regEX.Replace(source, "$1" & newstring & "$3")
Cela fonctionne, mais semble un peu négligé.