获取当前单词在插入符号处的 TextRange

我是 WPF 的新手,目前我正在学习创建一个具有语法高亮显示的 Sublime Text。我在找出当前插入符号位置的单词的 textrange 时遇到了一个挑战(不包括符号,例如:for( 将返回整个单词而不是 for 只返回)。更多结束,因为已经解决方案正在检查整个文件,这可能会大大降低性能。有没有解决这个问题的方法谢谢!下面是我的代码

private textrange getcurrentWordRange()
    {
        
        List<string> spaces = new List<string> { " ","\t",";","(",")","=" };
        List<string> symbols=new List<string>{};

        TextPointer current = richTextBox.CaretPosition;
        TextPointer start = current,end = current;

        //Traverse to get the start of word
        while (start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text)
        {
            textrange textrange = new textrange(start.GetPositionAtOffset(-1),start); // get the textrange of the previous start

            if (spaces.Any(token => textrange.Text.Contains(token))) // check if textrange.Text has token that inside spaces
                break;
            else
                start = start.GetPositionAtOffset(-1);
            
        }


        //Traverse to get the end of word
        while(end.GetPointerContext(LogicalDirection.Forward)==TextPointerContext.Text)
        {
            textrange textrange = new textrange(end,end.GetPositionAtOffset(1)); // get the textrange of the next start
            
            if (spaces.Any(token => textrange.Text.Contains(token)))
                break;
            else
                end = end.GetPositionAtOffset(1);
        }
        
        return new textrange(start,end);
    }

编辑 幸运的是,我重新思考并编写了可能在这种情况下成功的以下代码。希望任何人都可以检查它是否正确。谢谢。

    private textrange getcurrentWordRange()
        {
            List<string> spaces = new List<string> { " ","\t" };
            List<string> symbols = new List<string> { ";","=","<",">","\"",",".","[","]",":" };
            TextPointer current = richTextBox.CaretPosition;
            TextPointer start = current,end = current;
            textrange backward;
            textrange forward;

            // check if start and end are not the Content.Start and Content.End
            if (start.GetPositionAtOffset(-1) == null)
                backward = new textrange(start,start);
            else
                backward = new textrange(start.GetPositionAtOffset(-1),start);

            if (end.GetPositionAtOffset(1) == null)
                forward = new textrange(end,end);
            else
                forward = new textrange(end,end.GetPositionAtOffset(1));



            while (!spaces.Contains(backward.Text) && start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text && !symbols.Contains(backward.Text))
            {
                start = start.GetPositionAtOffset(-1);
                backward = new textrange(start,start.GetPositionAtOffset(-1));
            }
            while (!spaces.Contains(forward.Text) && end.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text && !symbols.Contains(forward.Text))
            {
                end = end.GetPositionAtOffset(1);
                forward = new textrange(end,end.GetPositionAtOffset(1));
            }

            // if between start and end is "" then consider add a left adjacent or right adjacent symbol for further development
            if (new textrange(start,end).Text == "")
            {
                if (symbols.Contains(backward.Text))
                {
                    start = start.GetPositionAtOffset(-1);
                }
                else if (symbols.Contains(forward.Text))
                {
                    end = end.GetPositionAtOffset(-1);
                }
            }

            return new textrange(start,end);
}

Capture

我为 RTB 创建了一个 TextChanged 事件,然后执行一些功能来检查和突出显示关键字 它适用于@Jackdaw 解决方案,但再次陷入这种情况

r598933630 回答:获取当前单词在插入符号处的 TextRange

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1190851.html

大家都在问