Как изменить символ разделения поиска? - PullRequest
1 голос
/ 26 мая 2020

Для справки, этот код взят из ответа на этот вопрос:

Выделить слово или фразу цветом, отличным от всех других выделений в тексте RichTextBox?

using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;

private class TextSearcher
{
    private BindingSource m_bsMatches = null;
    private RichTextBox m_Rtb = null;

    public TextSearcher(RichTextBox rtb) : this(rtb, Color.Yellow, Color.Red) { }
    public TextSearcher(RichTextBox rtb, Color selectionColor, Color currentColor)
    {
        this.m_Rtb = rtb;
        SelectionColor = selectionColor;
        CurrentColor = currentColor;
    }

    public string CurrentKeywords { get; private set; } = string.Empty;
    public bool CaseSensitive { get; set; } = true;
    public int CurrentIndex => m_bsMatches.Position;
    public Match CurrentMatch => (Match)m_bsMatches.Current;
    public MatchCollection Matches { get; private set; }
    public Color SelectionColor { get; set; }
    public Color CurrentColor { get; set; }

    public void GotoMatch(int position)
    {
        SelectText(false);
        this.m_bsMatches.Position = Math.Max(Math.Min(this.m_bsMatches.Count, position), 0);
        SelectText(true);
    }

    public void NextMatch()
    {
        SelectText(false);

        if (this.m_bsMatches != null && m_bsMatches.Position == this.m_bsMatches.Count - 1) 
        {
            this.m_bsMatches.MoveFirst();
        }
        else 
        {
            this.m_bsMatches.MoveNext(); 
        }

        SelectText(true);
    }

    public void PreviousMatch()
    {
        SelectText(false);

        if (this.m_bsMatches != null && this.m_bsMatches.Position > 0) 
        {
            this.m_bsMatches.MovePrevious();
        }
        else 
        {
            this.m_bsMatches.MoveLast(); 
        }

        SelectText(true);
    }

    public int Search(string keywords)
    {
        if (CurrentKeywords.Equals(keywords)) return Matches.Count;
        this.m_bsMatches?.Dispose();
        CurrentKeywords = keywords;

        var options = RegexOptions.Multiline |
                     (CaseSensitive ? RegexOptions.IgnoreCase : RegexOptions.None);
        Matches = Regex.Matches(this.m_Rtb.Text, keywords, options);

        if (Matches != null) 
        {
            this.m_Rtb.SelectAll();
            this.m_Rtb.SelectionColor = this.m_Rtb.ForeColor;
            this.m_Rtb.SelectionStart = 0;
            this.m_bsMatches = new BindingSource(Matches, null);
            SelectKeywords();
            return Matches.Count;
        }

        return 0;
    }

    private void SelectKeywords()
    {
        foreach (Match m in Matches) 
        {
            SelectText(false);
            NextMatch();
        }

        this.m_bsMatches.MoveFirst();
    }

    private void SelectText(bool current)
    {
        this.m_Rtb.Select(CurrentMatch.Index, CurrentMatch.Length);
        this.m_Rtb.SelectionColor = current ? CurrentColor : SelectionColor;
    }
}

Использование:

numericUpDown1.Maximum = rbsearcherhl.Search(textBox1.Text);

Например, текст в textBox1 - "System", но в моем поиске, когда вы хотите найти несколько слов, вы добавляете ,,, например System,,public или system,,public,,World

но в функции поиска в вызовах TextSearcher для поиска нескольких слов используется символ |

Как я могу изменить в поисковике, чтобы символ был например мой ,,?

Example

В этом примере для поиска нескольких слов вы вводите System|using, но вместо этого я хочу искать несколько слов с помощью набрав System,,using или System,,using,,public,,World

Вместо | как использовать ,,

1 Ответ

6 голосов
/ 26 мая 2020

Возьмите System,,public, введенный пользователем в ваше текстовое поле1 (или как бы вы его ни называли), и передайте его TextSearcher как

Search(textbox1.Text.Replace("|", "\\|").Replace(",,", "|"))

Или, как бы то ни было, вы создаете TextSearcher go

TextSearcher использует синтаксис Regex, | в регулярном выражении означает «или», поэтому «System | publi c» означает «System или publi c». Вы хотите, чтобы "System ,, publi c" означало то же самое, поэтому вам нужно либо:

  • научить Regex использовать ,, для OR вместо | или
  • отрегулируйте свой ,,, чтобы он стал тем, что регулярное выражение использует для OR (|)

Из двух, я посчитал, что последнее проще! Также преобразованы существующие | перед заменой ,,

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