突出显示代码中的匹配括号

时间:2014-03-24 13:54:48

标签: c# regex algorithm match brackets

我现在想为CLisp编写自己的便携式IDE一段时间,并且最近使用C#开始使用它。

我通过检查当前字符是否为括号然后在整个文本中向后/向前移动来实现括号突出显示,同时跟踪以下打开/关闭括号,直到打开和关闭括号的数量相等。

我使用简单的for循环完成了这个操作(同样"在找到匹配的括号后,断开" -for for循环),但是对于较大的代码块,该方法很慢。在RichTextBox中突出显示文本的方法似乎也有点低效,即通过以编程方式移动光标并应用突出显示来选择字符,然后取消选择并移回光标的原始位置。远离括号需要清除突出显示,因此我只需选择所有文本,然后删除其上的格式。

如果用户移动光标太快(使用键盘上的箭头键),应用程序可能无法跟踪光标应该在哪里,并且应用程序可能会错误地将其移回到先前的位置。简而言之,如果用户使用键盘滚动大块代码,我写的突出显示功能就无法跟上。

除了for循环之外,还有更有效的方法吗?我只是使用效率低下的方法来突出显示和取消突出括号吗? Regex可以在这里提供解决方案吗?

虽然我自己写了一段代码,但实际上我完成了Bill The Lizard在这里所做的事:How do I find the position of matching parentheses or braces in a given piece of text?

1 个答案:

答案 0 :(得分:2)

我相信Regex在这里不会帮助你 - 在这种情况下,它可能会更慢,因为它仍然必须通过char来查看代码char。

然而,有一个简单的"解决方案 - 在代码中创建所有代码块的树,并在用户更改代码时根据需要更新它(理想情况下,不是在每个按键上,但如果做得好,即使这是一个选项)。然后,每次移动光标时都不再需要找到下一个括号 - 您知道在哪个代码块中(通过索引进行简单查找),并且您立即知道代码的起始和结束括号的位置。

该方法假设更新块索引很容易 - 实际上,它的类型是;如果块在更新时位于光标之前,则不要更改它。如果它在光标之后,则将numberOfCharsInserted添加到所有索引。简单快捷。添加和删​​除新的代码块会变得很棘手,但这也会给Visual Studio带来麻烦:))

另一个有趣的解决方案可能是"空间分区"的变体。将代码拆分为可以轻松索引的部分(例如,二叉树或哈希表)。如果您还记得每个部分中的开始和结束括号的数量,您可以非常快速地确定您要查找的括号的位置,并根据部分粒度,您可以显着减少您需要的数量。搜索范围。

有很多方法可以优化搜索,但在某些时候,您只需要从头到尾查看文件。根据典型的用例,您必须选择正确的方法。在这种情况下,我相信简单地记住文件中所有括号的索引将是迄今为止最简单的解决方案,并且它非常快(代码中有多少个字符括号?添加1到一百个索引比搜索一千个字符快得多。而且你只需要在更改代码时这样做!)。虽然你说的是LISP,但不是吗?这可能是很多括号! :D