String.Replace不替换所有匹配项

Leo*_*eon 5 .net vb.net string replace

为什么line2只替换一半的事件?

    Dim line1 As String = "AAA|BBB|CCC|CCC|CCC|CCC|EEE|FFF"
    Dim line2 As String = "AAA|BBB|CCC|CCC|CCC|CCC|EEE|FFF"
    Dim line3 As String = "AAA|BBB|CCC|CCC|CCC|CCC|EEE|FFF"

    line1 = line1.Replace("CCC", "")
    line2 = line2.Replace("|CCC|", "||")
    line3 = line3.Replace("CCC|", "|")
Run Code Online (Sandbox Code Playgroud)

结果:

line1 = "AAA|BBB|||||EEE|FFF" -- OK, but fails when element is "..|ZZZCCCZZZ|.."
line2 = "AAA|BBB||CCC||CCC|EEE|FFF" -- Not OK
line3 = "AAA|BBB|||||EEE|FFF" -- OK, but fails similar to Line1 edge-case for "..|ZZZCCC|.."
Run Code Online (Sandbox Code Playgroud)

我尝试过使用RegEx,但得到了类似的结果.

下面真的没有比这更好的方法吗?

Do While line1.Contains("|CCC|")
    line1 = line1.Replace("|CCC|", "||")
Loop
Run Code Online (Sandbox Code Playgroud)

Chr*_*air 9

一旦找到第一个令牌,它就会开始该令牌之后寻找一个令牌.所以它找到,替换它,然后继续,它看到的第一件事是不匹配.它不预先扫描字符串,寻找要替换的标记.|CCC|CCC|

考虑一下这样:

特定 AAA|BBB|CCC|CCC|CCC|CCC|EEE|FFF

它运行到AAA|BBB|CCC| HOLD IT |CCC|被发现,让我们开始构建我们的字符串:

AAA|BBB+ ||(我们的替代品)

现在让我们继续前进,我们现在已经CCC|CCC|CCC|EEE|FFF离开了.

它运行到CCC|CCC| HOLD IT |CCC|被发现,让我们继续添加到我们的字符串:

AAA|BBB||CCC+ ||(我们的替代品)

现在让我们继续,我们现在已经CCC|CCC|EEE|FFF等等等等.

编辑:考虑MSDN上的条目描述返回值:

一个等于当前字符串的字符串,除了oldValue的所有实例都替换为newValue.

人们可以读到你预期它预先扫描字符串并找到所有匹配.我没有在MSDN文档中看到任何描述此角落案例的内容.也许这应该添加到MSDN文档中.

  • @JasonSperske它似乎并不令人困惑..至少在使用这样的方法一次或两次之后:D匹配*消耗它匹配的所有内容*和*跳过*任何替换的文本.如果不是这种情况那么可能会有无限的替换递归!例如`line1.Replace("X","X")` (3认同)