为什么?大文件超过 50m,编辑器正则替换很慢,代码直接处理很快

125 天前
 soap0X
1599 次点击
所在节点    问与答
5 条回复
agagega
125 天前
你没说是什么编辑器,也没说你的代码是怎么替换的。

一种可能是编辑器正则是 NFA ,也没考虑各种优化,刚好遇到文件里有大量回溯的情况。也有可能是编辑器渲染效率不行,替换后需要全部重绘,会卡很久。50M 这个级别,通常来说 Vim 和 Emacs 都没问题,VSCode 也不会有问题
geelaw
125 天前
有很多可能的原因,比如编辑器打开文件时,替换的内容永远是正在编辑的版本,而不是磁盘上的版本,而多数文本编辑器会使用特别的数据结构存储打开的文档(按行断开、使用 rope 等等),相比磁盘上的文件被程序一口气读完、替换完、写完,编辑器内替换需要重新把数据结构转换为适合被正则表达式匹配的样子(替换完后再重新变成适合用来编辑的数据结构),或者使用针对该结构的匹配算法,然后还需要重新渲染等等。

当然, @agagega #1 指出的问题最明显,因为观众不可能有读心术~

另 Re: #1
NFA 是抽象模型,和怎么实现没有必然联系,而且 NFA 最自然的实现也不用回溯。现代软件里的正则表达式也不是计算理论意义下的正则表达式,表达力强于 NFA 。
Zaden
125 天前
有个重要原因是编辑器需要在内存中保存撤销记录,代码只要考虑顺序读写就行了
flynaj
125 天前
这个快慢就是 GUI 程序的所见即所得决定的,内容每次改变都要刷新显示。所以就慢了,当然 50 兆这种大小现代编辑器都是秒完成的,我经常使用的是 emeditor
alexsz
125 天前
用 sed 命令啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1132597

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX