寻找给定字符串中的关键字。最简单,最快,+到目前为止我所拥有的

时间:2012-08-21 17:08:13

标签: c# winforms richtextbox

我正在制作语法着色工具。我目前正在编写方法来查找和突出显示关键字,如果是那么其他。我相信有更好(更快,更美观)的方法来做到这一点。

下面是两种方法,第一种我尝试并且不使用任何字符串方法,除了长度以尝试提高速度。

第二个我使用了字符串方法,但我被告知它们比第一种方式慢。

哪种方式更快?而对于第一个,只有当一个空格位于那个不正确的单词之后才会突出显示该单词,对此也有任何补救措施吗?

代码:

    private string[] m_keywords = new string[] { "GOTO", "IF", "THEN", "ELSE", "WHILE", "DO" };
    private int m_nShortestKeywordLength = 2;

    // lcpy_strLine is a copy in all uppercase of the current line I am processing

    private void ProcessKeywords(Color clr)
    {
        if(lcpy_strLine.Length > m_nShortestKeywordLength)
            for (int i = 0; i < m_keywords.Length; i++)
            {
                string curWord = m_keywords[i];
                int len = curWord.Length;
                for (int j = 0; j < lcpy_strLine.Length; j++)
                {
                    if (j + len < lcpy_strLine.Length)
                    {
                        int k = 0;
                        while (k < len && lcpy_strLine[j + k] == curWord[k])
                            k++;
                        if (k == len)
                        {
                            Console.WriteLine("Found Keyword");
                            SelectionStart = m_nLineStart + j;
                            SelectionLength = k;
                            SelectionColor = clr;
                        }
                    }
                }
            }
    }

    private void ProcessKeywords2(Color clr)
    {
        /*for (int i = 0; i < m_keywords.Length; i++)
            if (lcpy_strLine.Contains(m_keywords[i]))
            {
                int indx1 = lcpy_strLine.IndexOf(m_keywords[i]);
                SelectionStart = m_nLineStart + indx1;
                SelectionLength = m_keywords[i].Length;
                SelectionColor = clr;
            }*/

    }

2 个答案:

答案 0 :(得分:1)

最简单的方法可能是正则表达式。它也会相当快。

private string[] m_keywords = new string[] { "GOTO", "IF", "THEN", "ELSE", "WHILE", "DO" };
private Regex keywordRegex = new Regex(@"\b(" + string.Join("|", m_keywords) + @")\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);

并且不需要大写该行:

private void ProcessKeywords(Color clr)
{
    foreach (Match m in keywordRegex.Matches(someLine)) {
        SelectionStart = m.Index;
        SelectionLength = m.Length;
        SelectionColor = clr;
    }
}

答案 1 :(得分:0)

使用string.IndexOf时,您需要指定StringComparison.Ordinal才能获得良好的效果。 默认重载使用文化感知比较(例如,它认为“æ”等于“ae”),这比简单的逐字符比较要贵得多。