2012-07-28 20 views
5

debería Prefacio esto diciendo que estoy trabajando con VB6 & RegExpRegExp expresión regular Buscar y reemplazar sólo palabras completas

Estoy tratando de encontrar las palabras completas y suplentes, por "palabras completas" me refiero a una la coincidencia válida no es una subcadena de otra palabra, aunque algunos caracteres especiales estarán bien. Soy un principiante en expresiones regulares. Esto es lo que estaba intentando:

([^a-z]+)(Foo)([^a-z]+) 

Parece cerrado, pero estoy teniendo problemas en ciertas situaciones.

Por ejemplo, si encuentro la cadena

Foo Foo 

o

Foo(Foo) 

o en cualquier parte de una línea termina con Foo y la siguiente línea comienza con Foo

This is a line with Foo 
Foo starts the next line 

En cualquier de estos casos, solo el primer Foo se corresponde.

Bueno, tal vez no es un problema con el partido, sino más bien mi método de reemplazo. No sé exactamente cómo puedo verificar eso. Estoy usando grupos para reemplazar lo que limita carbón se corresponde con la expresión, así:

regEX.Replace(source, "$1" & newstring & "$3") 

Así que en resumen quiero evitar corresponder: FooBar barfoo

Cualquiera de los siguientes sería válida partidos

Foo Foo Foo bar

foo_bar
foo.bar
Foo, bar
Foo (bar)
Foo (Foo)

Si alguien amablemente me puede mostrar la forma correcta de hacer esto le agradecería mucho que!

editado

Parece que hablé un poco demasiado pronto con respecto a la primera solución a continuación. Después de algunas pequeñas pruebas y lecturas adicionales, veo que el guión bajo es una palabra char y, por lo tanto, el patrón anterior no coincidirá. Se me ocurrió esto, lo que hace el truco, ¿hay una mejor manera?

(\b)(Foo)(\b|_) 

regEX.Replace(source, "$1" & newstring & "$3") 

Funciona, pero parece un poco descuidado.

Respuesta

6

Utilice la expresión "límite de palabras" \b.

Tal vez algo tan simple como esto va a hacer:

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

FYI, la expresión límite de la palabra \b es un partido de anchura cero entre una palabra carácter \w y una no-palabra carácter [^\w] o viceversa y no consume entrada.


guión bajo y dígitos caracteres se consideran "caracteres de palabra", por lo Foo_Bar, Bar_Foo y Foo123 no coincidir. Para rectificar esto, de manera que cualquier no sea una letra se considera "fin de la palabra" (el principio y el final de la entrada), utilizar rodeos mirada:

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

Muchas gracias. Tengo mucho que aprender sobre expresiones regulares. Tuve que hacer un pequeño cambio, pero parece haberlo hecho. Simplemente \ bFoo \ b –

+0

Bueno, no era del todo perfecto. Modifiqué mi publicación original anterior. Los comentarios son bienvenidos –

+0

subrayado se considera un "carácter de Word", por lo que '\ b' no coincidirá entre una letra y un guión bajo. Sin embargo, hay una forma de hacerlo. Avísame si quieres que te muestre – Bohemian

Cuestiones relacionadas