Строка IndexOf и Заменить - PullRequest
       5

Строка IndexOf и Заменить

16 голосов
/ 07 февраля 2011

Я только что столкнулся с этой проблемой сегодня и задаюсь вопросом, есть ли у кого-нибудь представление о том, почему этот тест может не пройти (в зависимости от культуры). Цель состоит в том, чтобы проверить, содержат ли тестовый текст два пробела рядом друг с другом, что соответствует 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 ]

16 голосов
/ 07 февраля 2011

Да, я сталкивался с тем же самым раньше (хотя и с разными персонажами).В основном IndexOf будет учитывать различные аспекты «специальных» символов Юникода при поиске совпадений, тогда как Replace просто обрабатывает строки как последовательность кодовых точек.

Из документов IndexOf:

Этот метод выполняет поиск по слову (с учетом регистра и с учетом культуры) с использованием текущей культуры.Поиск начинается с первой позиции символа этого экземпляра и продолжается до последней позиции символа.

... и с Replace:

Этот метод выполняет порядковый (с учетом регистра и без учета культуры) поиск для поиска oldValue.

Можно использовать перегрузку IndexOf, которая принимает StringComparison и заставьте его выполнить порядковое сравнение.

1 голос
/ 07 февраля 2011

Как сказал Джон, используйте StringComparison.Ordinal, чтобы понять это правильно.

Assert.IsTrue(result.IndexOf(TWO_SPACES, StringComparison.Ordinal) < 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...