Как сделать так, чтобы моя строка сравнивалась без учета (игнорирования) незначительных различий в пустом пространстве? - PullRequest
8 голосов
/ 28 июля 2011

У меня есть несколько тестов, которые проверяют строки, которые отображаются для пользователя.

Я не хочу, чтобы тест провалился из-за изменений в отступах или разрывах строк и т. Д. Поэтому я ищу что-токак строка, сравните это.

  • Игнорировать в качестве пробела в качестве начала строки (легко использовать string.trim)
  • Когда любое число любого типа пробела рядом свсе совпадают друг с другом так же, как если бы это был один пробел.

Я мог бы начать создавать регулярное выражение, но у кого-то еще может быть лучшее решение, поэтому этот вопрос.

Ответы [ 4 ]

23 голосов
/ 28 июля 2011

Вы можете использовать CompareOptions :

String.Compare(a, b, CultureInfo.CurrentCulture, CompareOptions.IgnoreSymbols);

Выписка из MSDN:

Указывает, что сравнение строк должно игнорировать символы, такие как пробелы, знаки препинания, символы валют, проценты знак, математические символы, амперсанд и т. д.

6 голосов
/ 28 июля 2011

Написание пользовательского сравнения было бы сложно, если вам это нужно просто , чтобы сделать это для пробелов. Я бы предложил использовать для нормализации регулярное выражение, т.е.

private static readonly Regex normalizeSpace =
        new Regex(@"\s+", RegexOptions.Compiled);
...
string s = normalizeSpace.Replace(input, " ");

Очевидно, что нормализуются оба операнда, а затем проверяется на равенство как обычно.

1 голос
/ 13 марта 2013

Вы также можете использовать следующую пользовательскую функцию

        public static string ExceptChars(this string str, IEnumerable<char> toExclude)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str.Length; i++)
            {
                char c = str[i];
                if (!toExclude.Contains(c))
                    sb.Append(c);
            }
            return sb.ToString();
        }

        public static bool SpaceInsenstiveComparision(this string stringa, string stringb)
        {
            return stringa.ExceptChars(new[] { ' ', '\t', '\n', '\r' }).Equals(stringb.ExceptChars(new[] { ' ', '\t', '\n', '\r' }));
        }

А затем используйте его следующим образом

"Te  st".SpaceInsenstiveComparision("Te st");
0 голосов
/ 28 июля 2011

Я написал небольшую функцию, которая обрезает строку ввода как в начале, так и в конце. Затем он зацикливается на проверке двойных пробелов и, хотя существуют двойные пробелы, он заменяет их на один. Таким образом, в конце вы оставите только один пробел.

private static string RemoveSpaces(string input)
{
    input = input.Trim();
    while (input.Contains("  "))
        input = input.Replace("  ", " ");
    return input;
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...