Поиск текста без учета регистра в C #: как сохранить исходный регистр при выделении совпадающих фраз? - PullRequest
0 голосов
/ 23 октября 2019

У меня текстовый поиск без учета регистра (в контроллере я делаю .ToLower() по обе стороны сравнения), и я выделяю поисковые фразы в тексте результата следующим образом:

@Html.Raw(searchPhrase.Length == 0 
    ? item.Description 
    : (item.Description ?? "") // An item's Description could be NULL
        .Replace(searchPhrase, $"<span class='highlight'>{searchPhrase}</span>"))

Отображаются элементы, соответствующие поисковой фразе, но если регистр не совпадает, подсветка не будет.

Я хочу, чтобы соответствующий текст был выделен, даже если регистр не совпадает,и я хочу сохранить исходный регистр.

Например: если я ищу "Картошка", в результатах поиска должны быть выделены "Картошка" и "Картошка".

Я виделнекоторые похожие вопросы вокруг, но не для C #, и я не смог перевести ни одно из решений для C #.

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Ну, вы не можете сделать Заменить так, потому что вы перезаписываете свои исходные данные.

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

        string testData = "This is my fake data for matching this string";
        string searchPhrase = "thiS";
        string resultSet = "";
        for (int i = 0; i < testData.Length - searchPhrase.Length; i++)
        {
            if (searchPhrase.ToLower() == testData.Substring(i, searchPhrase.Length).ToLower())
            {
                resultSet += "<span class='highlight'>" + testData.Substring(i, searchPhrase.Length) + "</span>";
                i += searchPhrase.Length -1;
            }
            else
            {
                resultSet += testData[i].ToString();
            }
        }
        Console.WriteLine(resultSet);

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

1 голос
/ 23 октября 2019

Чтобы пояснить комментарий @stuartd, вот как использовать Regex.Replace для того же:

var ans = searchPhrase.Length == 0
            ? (item.Description ?? String.Empty)
            : Regex.Replace((item.Description ?? String.Empty), // An item's Description could be NULL
                            Regex.Escape(searchPhrase),
                            "<span class='highlight'>$&</span>",
                            RegexOptions.IgnoreCase);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...