我想知道如何在richtextbox中突出显示多个单词,例如
我搜索的单词是“la” 在文本“la langue”;
我这里有这段代码
private void Surligne(string[] mots)
{
foreach (string word in mots)
{
int Index = 0;
while (Index < rtb.TextLength)
{
int wordStartIndex = rtb.Find(word, Index, RichTextBoxFinds.None);
if (wordStartIndex != -1)
{
rtb.SelectionStart = wordStartIndex;
rtb.SelectionLength = word.Length;
rtb.SelectionBackColor = Color.Yellow;
}
else
break;
Index += wordStartIndex + word.Length;
}
}
}
但它突出了la'la'ngue
我只希望它突出显示la而不是'la'langue。
如何更改代码才能执行此操作?感谢。
答案 0 :(得分:0)
扩展来自@ sab669的评论,这些是在代码中建议的两种方式。确切的结果将取决于你如何确定一个单词(一个数字可以是单词的一部分吗?连接器如下划线怎么样?),但对于大多数情况,这些应该是相同的。
<强> 1。检查相邻字符
这只需要修改while
循环。您必须检查相邻的字符,请记住您可能位于字符串的开头或结尾:
while (Index < rtb.TextLength)
{
int wordStartIndex = rtb.Find(word, Index, System.Windows.Forms.RichTextBoxFinds.None);
if (wordStartIndex == -1)
break;
if ((wordStartIndex == 0 || !char.IsLetterOrDigit(rtb.Text[wordStartIndex - 1])) &&
(wordStartIndex + word.Length >= rtb.TextLength || !char.IsLetterOrDigit(rtb.Text[wordStartIndex + word.Length])))
{
rtb.SelectionStart = wordStartIndex;
rtb.SelectionLength = word.Length;
rtb.SelectionBackColor = System.Drawing.Color.Yellow;
}
Index += wordStartIndex + word.Length;
}
<强> 2。使用正则表达式
这会导致代码更短,幸运的是正则表达式并不那么困难:
foreach (Match match in Regex.Matches(rtb.Text, "\\b" + word + "\\b"))
{
rtb.SelectionStart = match.Index;
rtb.SelectionLength = word.Length;
rtb.SelectionBackColor = System.Drawing.Color.Yellow;
}
我使用了\b
,它表示单词字符和非单词字符之间的边界。有关详细信息,您可以查看MSDN page,其中还会提供有关这些字符究竟是什么的信息。