Есть ли способ найти индекс каждого (указанного) слова в строке и способ запустить метод, когда он находит (указанное) слово - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь найти способ получить индекс каждого указанного слова в строке:

Ввод:
Строка, представляющая слово для поиска

Желаемое поведение:
Запустите метод и задайте ему индекс (что-то вроде foreach)

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

Вот так (я использую жирный шрифт, но представьте, что это цвет)

Ввод:

string text = "I want to throw my pc off the window. I want to go party" 

string word = "want"

markup(text, word , richtextbox) 

Вывод:

Я хочу , чтобы выбросить мой p c из окна. Я хочу на go вечеринку


Google не дал никаких полезных результатов.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

это должно работать, если вы хотите найти словесные индексы для внесения некоторых изменений в ваш richtextbox:

void Main()
{
   string text = "I want to throw my pc off the window. I want to go party";
   string word = "want";

    var indexes = GetWordIndexes(text,word)
    foreach (var inx in indexes)
    {
        markup(text, inx, richtextbox)
    }
}

public IEnumerable<int> GetWordIndexes(string text, string word)
{
    int wordLength = word.Length;
    for (int i = 0; i < text.Length; i++)
    {
        if (!(text.Length - wordLength < i) && text.Substring(i,wordLength) == word) 
            yield return i;
    }
}

0 голосов
/ 07 февраля 2020

Вы можете использовать метод IndexOf, чтобы получить индекс одной строки в другой. Он принимает аргумент, который указывает, с чего начать поиск, поэтому вы можете постоянно вызывать его в al oop и просто увеличивать начальный индекс на каждой итерации. Если он возвращает -1, это означает, что строка не была найдена, поэтому мы можем использовать ее как условие для l oop.

Например, этот метод принимает элемент управления RichTextBox и string для поиска, и он выделит все экземпляры текста для поиска в тексте RTB:

private static void HighlightText(RichTextBox rtb, string text, Color? highlight = null)
{
    if (rtb == null || rtb.TextLength == 0 || text == null || text.Length == 0) return;

    // Find the first index of the text
    var index = rtb.Text.IndexOf(text);
    var length = text.Length;
    var color = highlight ?? Color.Red;  // Use Red if no color was specified

    // While we found a match
    while (index > -1)
    {
        // Highlight it
        rtb.SelectionStart = index;
        rtb.SelectionLength = length;
        rtb.SelectionColor = color;

        // Then try to find the next index of the text (starting after the previous one)
        index = rtb.Text.IndexOf(text, index + length);
    }
}

Для примера использования отбросьте RichTextBox, TextBox и Button управляйте формой и добавьте этот код к событию Button.Click:

private void button1_Click(object sender, EventArgs e)
{
    HighlightText(richTextBox1, textBox1.Text);
}

Вывод

enter image description here


Обновление

Если вы хотите выделить несколько элементов одновременно, вы можете создать перегрузку метода, которая принимает массив строк и затем вызывает метод выше для каждого элемента в массиве:

private static void HighlightItems(RichTextBox rtb, string[] items, Color? highlight = null)
{
    if (items == null || items.Length == 0) return;

    foreach (var item in items)
    {
        HighlightText(rtb, item, highlight);
    }
}

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

private void button1_Click(object sender, EventArgs e)
{
    // Un-highlight the text first
    richTextBox1.SelectAll();
    richTextBox1.SelectionColor = Color.Black;

    // Call highlight with an array of strings created by 
    // splitting textbox1.Text on the ';' character
    var multipleItems = textBox1.Text.Split(';');
    HighlightItems(richTextBox1, multipleItems);
}

Выход

enter image description here

0 голосов
/ 07 февраля 2020

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

        string text = "I want to throw my pc off the window. I want to go to a party.";

        string word = "want";

        string pattern = $@"({word})";

        MatchCollection matches = Regex.Matches(text, pattern);

        foreach(Match match in matches)
        {
            Console.WriteLine(match.Index); // print indexes
        }

Вместо печати индексов, как в этом примере, вы можете использовать индексы для выделения текста.

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