7

我应该先声明我正在使用 VB6 和 RegExp

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

([^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(bar)
Foo(Foo)

如果有人能告诉我正确的方法来做到这一点,我将不胜感激!

已编辑

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

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

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

它有效,但似乎有点草率。

4

1 回答 1

16

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

也许像这样简单的事情就可以了:

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

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


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

(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*)
于 2012-07-28T01:28:16.223 回答