7 votes

RegExp expression régulière trouver et remplacer des mots entiers seulement

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é.

16voto

Bohemian Points 134107

Utilisez l'expression "limite de mots". \b .

Peut-être que quelque chose d'aussi simple que ceci fera l'affaire :

(.*)\bFoo\b(.*)

Pour info, le mot expression limite \b est une correspondance de largeur nulle entre un caractère de mot \w et un caractère non verbal [^\w] ou vice-versa, et ne consomme aucune entrée.


Les caractères de soulignement et les caractères numériques sont considérés comme des "caractères de mot", donc Foo_Bar , Bar_Foo et Foo123 ne correspondaient pas. Pour rectifier cela, afin que tout une non-lettre est considérée comme une "fin de mot" (y compris le début et la fin de l'entrée), utilisez des contournements :

(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X