【问题标题】:RegExp regular expression find & replace whole words onlyRegEx 正则表达式仅查找和替换整个单词
【发布时间】:2012-07-28 01:26:34
【问题描述】:

我应该先声明我正在使用 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")

所以总而言之,我想避免匹配: 富吧 吧台

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

富富
富吧
Foo_bar
Foo.bar
福,酒吧
Foo(酒吧)
富(Foo)

如果有人能告诉我正确的方法,我将不胜感激!

已编辑

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

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

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

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

【问题讨论】:

    标签: regex


    【解决方案1】:

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

    也许就这么简单:

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

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


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

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

    【讨论】:

    • 非常感谢。我有很多关于正则表达式的知识。我确实必须做一个小改动,但它似乎已经成功了。简单的 \bFoo\b
    • 嗯,它不是很完美。我修改了上面的原始帖子。欢迎评论。
    • 下划线被视为“单词字符”,因此\b 不会匹配字母和下划线。 一种方法可以做到这一点。如果你想让我给你看,请告诉我
    • @F.Vosnim 模式很好,可以为我编译。 Regex101 使用忽略大小写的标志而不是(?i),并且似乎不理解负面的看法。对我来说似乎是一个错误。我一直不喜欢regex101;我觉得它不直观(而且它在移动设备上也不起作用,这是我大部分发帖的地方)。
    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多