string IndexOf和Replace

时间:2011-02-07 15:39:38

标签: c# .net replace

我今天刚遇到这个问题,并想知道是否有人知道为什么这个测试可能会失败(取决于文化)。目的是检查测试文本是否包含彼此相邻的两个空格,这根据string.IndexOf进行(即使我告诉字符串将所有出现的两个空格替换为彼此)。经过一些测试后,似乎\xAD导致了这个问题。

public class ReplaceIndexOfSymmetryTest
{
    [Test]
    public void IndexOfShouldNotFindReplacedString()
    {
        string testText = "\x61\x20\xAD\x20\x62";
        const string TWO_SPACES = "  ";
        const string ONE_SPACE = " ";
        string result = testText.Replace(TWO_SPACES, ONE_SPACE);
        Assert.IsTrue(result.IndexOf(TWO_SPACES) < 0);
    }
}

2 个答案:

答案 0 :(得分:16)

是的,之前我遇到过同样的事情(尽管角色不同)。基本上IndexOf在查找匹配时会考虑“特殊”Unicode字符的各个方面,而Replace只是将字符串视为一系列代码点。

来自IndexOf docs

  

此方法使用当前文化执行单词(区分大小写和文化敏感)搜索。搜索从此实例的第一个字符位置开始,一直持续到最后一个字符位置。

...来自Replace

  

此方法执行序数(区分大小写和区分大小写)搜索以查找oldValue。

您可以使用IndexOf的重载,该重载需要StringComparison,并强制它执行序数比较。

答案 1 :(得分:1)

像Jon说的那样,使用StringComparison.Ordinal来做对。

Assert.IsTrue(result.IndexOf(TWO_SPACES, StringComparison.Ordinal) < 0);