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

标签 c# regex algorithm match brackets

我想为 CLisp 编写自己的可移植 IDE 一段时间了,最​​近开始使用 C#。

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

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

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

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

虽然我自己编写了一段代码,但本质上我所做的正是蜥蜴比尔在这里所做的:How do I find the position of matching parentheses or braces in a given piece of text?

最佳答案

我相信正则表达式不会在这里帮助你 - 在这种情况下,它可能会更慢,因为它仍然需要逐个字符地遍历代码。

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

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

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

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

关于c# - 突出显示代码中匹配的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22611432/

相关文章:

algorithm - 从 ulong 中删除位的快速方法

algorithm - 如何找到二维长区域的中心线

c# - Clipboard.SetContent 中的错误

c# - 使用 C# 使用 NLog 和控制台应用程序仅发送一封包含所有错误的电子邮件

c# - 基于 JsonSerializerSettings 确定 JSON.Net 属性映射

javascript - 如何选择第一个单词相同而最后一个单词可选的属性?

regex - 查找搜索项加上前后 4 行

c# - 页面范围的正则表达式

algorithm - 平衡四叉树

c# - 如何使用 txt 文件作为命令行参数?