简体中文

文本和日常工具·文本工具包

为什么查找和替换工具必须在半类型正则表达式中生存

· 为什么它很重要

查找和替换 正则表达式 文本编辑

文本旁边不完整的正则表达式,保持安全不变
原始 ToolAcre 矢量图

键入模式是增量的,因此单独的左括号是正常状态;这篇文章认为,保护编译、保持文本不变以及提供撤消功能是正确性功能,而不是修饰功能。

清理不平衡支架上的盒子的工具 - 一次击键如何毁掉一小时的清理工作

查找和替换框通常包含比其旁边的搜索模式花费更长时间来组装的工作。如果不完整的表达式可能会抛出界面、清除编辑器或使其状态不确定,那么该工具就会使模式输入比它本来要简化的清理任务更加危险。

存储库没有记录 ToolAcre 删除一小时工作的具体事件,因此该故事不能作为事实呈现。无论如何,可辩护的要求更强:每当模式编译失败时,用户文本必须保持不变,无论存在多少文本或准备需要多长时间。

查找和替换工具必须防止的破坏性故障

正则表达式通常不是通过一次完美的按键输入的。人们在右括号之前键入左括号,或者在添加其成员之前以左括号开始字符类。在这些时刻,即使编辑过程正常进行,该字段仍包含语法不完整的模式。

将临时状态视为异常用户行为会产生一个脆弱的编辑器。有用的响应是立即的本地反馈:显示当前模式无法编译,保留所有其他字段,并让下一次击键修复它。无效的正则表达式错误应该描述当前草稿,而不是终止工作流程。

编写正则表达式时,不完整的模式是正常的

ToolAcre 通过 `compilePattern` 路由每个用户提供的搜索。文字搜索首先转义正则表达式元字符,而正则表达式模式直接使用提供的源。编译发生在 `try` 块内,失败返回一个空模式加上一个错误字符串,而不是允许 JavaScript 异常逃逸到接口中。

该结果控制替换路径。当编译报告错误时,`findReplace` 返回原始文本、零替换和错误。它不会尝试部分搜索或重写。因此,该防护可以保护界面稳定性和数据完整性:没有有效模式意味着编辑器内容不会发生突变。

报告发生的情况 - 为什么每次运行后的替换计数是最快的健全性检查

成功的替换在逻辑上仍然可能是错误的。广泛的表达式可能会匹配比预期更多的日期,而大小写选项或全字边界可能会将集合减少为零。 ToolAcre 在调用标准字符串替换之前对匹配项进行计数,并使用重写的文本返回该数字,从而使范围在每次运行后可见。

计数是一种快速的健全性检查,而不是证明每场比赛都是理想的。如果预期有 12 个记录并且结果显示 1 或 1,200,请在复制输出之前停止并检查模式。精确的数字可以将模糊的怀疑变成撤消和修改搜索的具体理由。

撤消作为安全网 — 每个变换都是可逆的,记录的操作限制为 50 次

编译安全性可以防止无效模式更改文本,但有效模式仍然可以表达错误的意图。撤消涵盖了第二类。文本工具包记录转换,以便在结果计数或输出显示搜索太宽、太窄或错误分组后可以撤消已完成的替换。

记录的历史限制是五十个操作,因此撤消是一个工作缓冲区而不是永久版本控制。用它来进行小步骤的实验,但不要将其视为档案存储。对于重要材料,请单独保留原始材料,并仅在检查文本和替换计数后才复制完成的输出。

工作示例 - 逐个字符构建日期重新格式化模式并观察错误的出现和消失而不丢失文本

考虑将日期从 `2024-01-02` 更改为 `02/01/2024`。启用正则表达式并以左括号开头。此时,浏览器引擎会报告无效表达式,ToolAcre 会显示消息,并且文本保持不变。添加 `\d{4}` 和右括号,第一个捕获的年份将变得有效。

继续,直到搜索到 `(\d{4})-(\d{2})-(\d{2})`,然后使用 `$3/$2/$1` 作为替换。这三个捕获重新排序年、月和日,而无需重新键入每一行。运行全部替换,将报告的计数与预期的行进行比较,如果不相关的数字文本也匹配,则立即撤消。

这不包括什么 - 正则表达式性能问题,例如巨大输入上的灾难性回溯

编译防护解决语法错误,而不是有效表达式的运行时间。模式可以成功编译,但会对特定输入进行大量回溯。由于替换在主线程上运行,因此即使没有引发异常,应用于大型文档的病态表达式仍然可能导致浏览器选项卡无响应。

该工具还执行全部替换,而不是逐个逐个匹配,并且在突变之前不会预览突出显示的匹配。这些限制使得狭窄的测试数据和替换计数变得非常重要。在将其应用于大型文档的唯一副本之前,先在小型代表性样本上验证不熟悉的表达式。

要点 — 文本工具包将无效模式视为信息,而不是失败,因此您可以安全地进行实验

不完整模式是有关编辑状态的信息,而不是用户失败的证据。 ToolAcre 在其返回值中保留了这种区别:编译可以报告错误而不引发错误,替换可以报告零更改而不触及源代码,成功的操作可以准确报告它重写了多少个匹配项。

该设计支持实验,而无需假装正则表达式是无害的。保留编译失败时的输入,检查成功后的计数,并在有效模式概念上错误时使用撤消。这些行为一起使得查找和替换对于偶尔的正则表达式用户来说足够可预测,他们需要反馈而不是对半类型表达式的惩罚。