0

.xls ファイルにリストされている richtextBox 内のすべての単語を強調表示する必要があります。これが私のコードの一部です。

public void HighlightWords(RichTextBox rtb1, DataTable dtXLS)
{
    for (int i = 0; i < dtXLS.Rows.Count; i++)
    {
        string[] wordsToRedact = new string[dtXLS.Rows.Count];

        wordsToRedact[i] = dtXLS.Rows[i][0].ToString();

        Regex test = new Regex(@"[\p{P}|\s](" + wordsToRedact[i] + @")[\p{P}|\s]", RegexOptions.Singleline | RegexOptions.Compiled);
        MatchCollection matchlist = test.Matches(rtb1.Text);

        if (matchlist.Count > 0)
        {
            for (int j = 0; j < matchlist.Count; j++)
            {
                WordsToRedact words = new WordsToRedact(matchlist[j]);
                HighLighting highLight = new HighLighting();
                highLight.Highlight_Words(rtb1, words);
            }
        }
    }
}

class HighLighting
{
    public void Highlight_Words(RichTextBox rtb, WordsToRedact e)
    {
        rtb.SelectionBackColor = Color.LightSkyBlue;
        rtb.SelectionStart = e.index;
        rtb.SelectionLength = e.length;

        rtb.ScrollToCaret();
    }
}

class WordsToRedact
{
    public int index;
    public int length;
    public string value;

    public WordsToRedact(Match m)
    {
        this.index = m.Groups[1].Index;
        this.length = m.Groups[1].Length;
        this.value = m.Groups[1].Value;
    }   
}

問題は、正規表現にも一致する単語の一部が強調表示されなかったことです。一部は強調表示されていますが、一部は強調表示されていません。精度は私の問題であり、どこが間違っているのかわかりません。

4

3 に答える 3

1

私はあなたのコードをチェックしました、それにいくつかの問題がありました、私はそれらを以下にリストします:
最初:

for (int i = 0; i < dtXLS.Rows.Count; i++)
{
    string[] wordsToRedact = new string[dtXLS.Rows.Count];
    ...  

間違っている場合は、forループの前に文字列配列を初期化する必要があります。そうしないと、ループの反復ごとに更新されます。次のようにします。

string[] wordsToRedact = new string[listBox1.Items.Count];
for (int i = 0; i < dtXLS.Rows.Count; i++)
{
   ...

2番目:(あなたの主な問題)
選択した部分を前ではなく選択した後に色付けする必要があります。そのため、コードは最後の一致を選択しません。これを行う必要があります:

rtb.SelectionStart = e.index;
rtb.SelectionLength = e.length;
rtb.SelectionBackColor = Color.LightSkyBlue;

そして最後:(疑いを持って)私は思いますが、[1]ではなくインデックスゼロ[0]を使用すべきかどうかはわかりません。

public WordsToRedact(Match m)
{
    this.index = m.Groups[0].Index;
    this.length = m.Groups[0].Length;
    this.value = m.Groups[0].Value; 
}
于 2012-08-21T04:32:59.253 に答える
0

これは機能します:

Regex test = new Regex(@"\b(" + wordsToRedact[i] + @")\b", 
RegexOptions.Singleline | RegexOptions.Compiled);
于 2012-08-21T04:01:25.460 に答える
0

mahdi-tahsildari の答えは私の問題に答えました! しかし、彼の答えに加えて、私が試した他のオプションも投稿して問題を解決したいと思います。

HighLighting クラスを次のコードに変更しました。

class HighLighting
{
    public void HighlightText(RichTextBox rtb, string word)
    {
        int s_start = rtb.SelectionStart, startIndex = 0, index;

        while ((index = rtb.Text.IndexOf(word, startIndex)) != -1)
        {
            rtb.Select(index, word.Length);
            rtb.SelectionBackColor = Color.Yellow;

            startIndex = index + word.Length;
        }

        rtb.SelectionStart = s_start;
        rtb.SelectionLength = 0;
        rtb.SelectionColor = Color.Black;
        rtb.ScrollToCaret();
    }
}

そしてすべてがうまくいきます。このコードと mahdi-tahsildari の答えは同じことをしました! ご助力いただきありがとうございます!:))

于 2012-08-21T05:20:07.127 に答える