Почему некоторые символы игнорируются при вызове LastIndexOf? - PullRequest
3 голосов
/ 17 марта 2019

Пожалуйста, посмотрите на эти коды:

string str_to_find = "➖➖➖➖➖➖➖➖➖➖\r\n";
string str = "Nancy" + str_to_find;
if (str.EndsWith(str_to_find)) {
    str = Remove_Last_String(str, str_to_find);
}

А вот и метод:

public static string Remove_Last_String(string Source, string Find) {
    int i = Source.LastIndexOf(Find);
    if (i >= 0) {
        string new_str = Source.Substring(0, i);
        return new_str;
    }
    else return Source;
}

Я хочу Nancy для вывода.
Но метод возвращает:
Nancy➖➖➖➖➖➖➖➖➖➖
В чем проблема с этими странными персонажами и как я могу это исправить?

Ответы [ 3 ]

4 голосов
/ 18 марта 2019

Вы возитесь с необычными символами Юникода. Или, может быть, они возятся с тобой. Пожалуйста, всегда указывайте стиль сравнения строк. Используйте это в своем коде:

int i = Source.LastIndexOf(Find, StringComparison.Ordinal);

StringComparison.Ordinal заставляет сравнение строк игнорировать текущие настройки культуры. Видимо, настройки культуры заставляют алгоритм вести себя иначе, чем вы / мы хотим / ожидаем.

3 голосов
/ 18 марта 2019

Состояние документы :

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

➖ - игнорируемый символ, который объясняет, почему поиск "\r\n" или "y➖➖➖➖➖➖➖➖➖➖\r\n" ведет себя «как ожидалось», а "➖➖➖➖➖➖➖➖➖➖\r\n" - нет.

Использование StringComparison.Ordinal, как показывает @AlKepp, решит проблему, поскольку сравнение не будет учитывать культуру.

См. Также Список игнорируемых символов для сравнения строк .

2 голосов
/ 18 марта 2019
using System;

public class Program
{
    public static void Main()
    {
        string str_to_find = "➖➖➖➖➖➖➖➖➖➖\r\n";
        string str = "Nancy" + str_to_find;
        if (str.EndsWith(str_to_find)) {
            str = Remove_Last_String(str, str_to_find);
            Console.WriteLine(str);
        }
    }

    public static string Remove_Last_String(string Source, string Find) {


    int i = Find.Length;
    int j = Source.Length;
    if (i >= 0) {
        string new_str = Source.Substring(0, j-i);
        return new_str;
    }
    else return Source;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...