RegEx正则表达式查找和;只替换整个单词

时间:2012-07-28 01:26:34

标签: regex

我应该通过声明我正在使用VB6&正则表达式

我试图通过“整个单词”找到并替换整个单词,我的意思是有效匹配不是另一个单词的子串,尽管一些特殊字符可以。我是正则表达式的新手。这就是我的尝试:

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

看起来很接近,但在某些情况下我遇到了一些麻烦。

例如,如果我找到字符串

Foo Foo

Foo(Foo)

或以Foo结尾的任何地方,以下行以Foo

开头
This is a line with Foo
Foo starts the next line

在任何一种情况下,只有第一个Foo匹配。

好吧,也许这不是匹配的问题,而是我的替换方法。我不确切知道如何验证这一点。我正在使用组来替换表达式匹配的任何边界字符,如下所示:

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

总而言之,我想避免匹配: FooBar的 BarFoo

以下任何一种都是有效的匹配:

Foo Foo
Foo Bar
foo_bar这样
Foo.bar
Foo,bar
美孚(酒吧)
FOO(FOO)

如果有人能告诉我正确的方法,我会非常感激!

编辑

看起来我对下面的第一个解决方案说得太早了。经过一些测试和进一步阅读后,我看到下划线是一个单词char,因此上面的模式将不匹配。我想出了这个诀窍,有更好的方法吗?

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

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

它有效,但看起来有点草率。

1 个答案:

答案 0 :(得分:11)

使用“单词边界”表达式\b

也许这样简单的事情会发生:

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

仅供参考,单词边界表达\b是单词字符\w与非单词字符[^\w]之间的零宽度匹配或反之亦然,并且不消耗任何输入。


下划线和数字字符被视为“字词字符”,因此Foo_BarBar_FooFoo123不匹配。要纠正这一点,以便任何非字母被视为“词尾”(包括输入的开头和结尾),请使用环顾四周:

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