.net - String.Replace 不会替换所有匹配项

标签 .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|", "|")

结果:

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|.."

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

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

Do While line1.Contains("|CCC|")
    line1 = line1.Replace("|CCC|", "||")
Loop

最佳答案

一旦找到第一个 token ,它就会开始寻找该 token 之后的下一个。因此它找到 |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 上的条目描述返回值:

A string that is equivalent to the current string except that all instances of oldValue are replaced with newValue.

可以将其解读为您所期望的,它会预扫描字符串并找到所有匹配项。我在 MSDN 文档中没有看到任何描述这个极端情况的内容。也许这应该添加到 MSDN 文档中。

关于.net - String.Replace 不会替换所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713820/

相关文章:

c# - Entity Framework 原始 SQL 查询

c# - 如何通过名称激活派生类型?

mysql - VB.net与MYSQL5连接

c# - 将虚拟文件拖入 Microsoft Office Communicator 2007

.net - 如何在线程中打开表单并强制其保持打开状态

asp.net - 检查 .net 中文本框值是否更改

sql-server - 如何将图像插入到 SQL Server 数据库表中

python - 使用 Python 进行字符串解析

mysql - 在mysql中连接任意数量的字符串行(分层查询)

python - 匹配子字符串是否存在于 python 字典的键中的最佳方法