我应该通过声明我正在使用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
以下任何一种都是有效的匹配:
如果有人能告诉我正确的方法,我会非常感激!
编辑
看起来我对下面的第一个解决方案说得太早了。经过一些测试和进一步阅读后,我看到下划线是一个单词char,因此上面的模式将不匹配。我想出了这个诀窍,有更好的方法吗?
(\b)(Foo)(\b|_)
regEX.Replace(source, "$1" & newstring & "$3")
它有效,但看起来有点草率。
答案 0 :(得分:11)
使用“单词边界”表达式\b
。
也许这样简单的事情会发生:
(.*)\bFoo\b(.*)
仅供参考,单词边界表达\b
是单词字符\w
与非单词字符[^\w]
之间的零宽度匹配或反之亦然,并且不消耗任何输入。
下划线和数字字符被视为“字词字符”,因此Foo_Bar
,Bar_Foo
和Foo123
不匹配。要纠正这一点,以便任何非字母被视为“词尾”(包括输入的开头和结尾),请使用环顾四周:
(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*)