文本和日常工具·文本工具包
全字搜索的工作原理:字边界和猫|狗问题
· 工作原理
正则表达式 查找和替换 文本编辑
解释 JavaScript 正则表达式中的单词边界是什么,为什么“cat”不能在“concatenate”内匹配,以及为什么在添加边界之前必须对像 cat|dog 这样的交替进行分组。
更改“连接”的重命名 - 为什么短单词的简单查找和替换会损坏较长的单词
产品重命名看起来无害,除非短名称出现在不相关的单词中。将每次出现的 `cat` 替换为 `lynx` 会将 `concatenate` 更改为 `conlynxenate`,即使没有编辑者打算重命名该动词的一部分。当搜索规则太宽泛时,仅匹配计数无法保护文档。
全字匹配会在发生任何替换之前缩小规则范围。在 ToolAcre 中,启用全字使独立的 `cat` 符合资格,同时保持 `concatenate` 内的相同字母不变。区别是结构性的而不是基于字典的:正则表达式引擎检查每个可能匹配旁边的字符。
\b 的含义 — 单词字符和非单词字符之间的零宽度位置
在 JavaScript 正则表达式中,`` 标记零宽度字边界。它不占用任何字母、空格或标点符号。相反,它在一侧是单词字符而另一侧不是单词字符的位置成功,包括当相邻字符符合单词字符时的文本开头或结尾。
JavaScript 的 `w` 类别为此实现提供了相关的单词字符:ASCII 字母、数字和下划线。因此 `cat` 匹配空格、逗号或行尾旁边的 `cat` ,但不匹配 `concatenate` 内的 `cat` 段,因为该段的两侧都通过单词字符继续,并且那里不存在边界。
字面模式下的整个单词 — 首先对搜索文本进行转义,然后用边界换行
关闭正则表达式后,ToolAcre 首先转义搜索文本中的每个正则表达式元字符。句号仍然是字面句号,括号仍然是字面括号,加号仍然是加号。只有在转义步骤之后,整个单词才会换行生成的源代码,因此用户标点符号不能默默地成为正则表达式语法。
包装器是 `(?:… )` ,没有显示空间:内部 `(?:…)` 是非捕获组。对于诸如 `cat` 之类的简单文字,效果相当于 `cat`。分组仍然很重要,因为一个编译路径必须安全地处理简单的术语和更复杂的替代项,而无需更改捕获组编号。
正则表达式模式下的整个单词 - 为什么 cat|dog 必须作为一组进行界定,或者边界仅绑定到一个分支
正则表达式模式使输入的模式保持不变,但整个单词仍然在添加边界之前对其进行分组。对于 `cat|dog`,ToolAcre 编译概念形式 `(?:cat|dog)`。因此,两种选择都必须在字边界处开始和结束,因此独立 `cat` 和独立 `dog` 在同一规则下匹配。
如果没有该组,`cat|dog` 将分为两个分支:左边界将仅约束 `cat`,而右边界将仅约束 `dog`。交替的优先级低于周围序列。分组是将两个边界断言应用于整个选择,而不是不均匀地分布一个断言。
工作示例 - 在整个文档中重命名产品,并根据预期检查替换计数
粘贴包含 `cat`、`dog`、`concatenate`、`dogged` 和标点符号(如 `cat, dog.`)的代表性段落,输入 `cat|dog`,打开正则表达式和全字,然后运行将全部替换为新产品名称。两个独立的动物词应该改变;较长的单词应保持原样。
在接受编辑之前阅读报告的替换计数。如果文档具有三个已知的独立引用,但该工具报告两个或十二个,请选择“撤消”并检查示例上下文。 ToolAcre 在调用标准字符串替换之前对匹配项进行计数,因此显示的总数是对您实际编译的搜索规则的实际检查。
单词边界让您感到惊讶 - JavaScript 的单词字符是 ASCII 字母、数字和下划线,因此重音单词和非拉丁单词需要测试
这些边界不实现多语言词典或 Unicode 文本分段算法。由于重音字母和非拉丁文字不属于此处使用的 ASCII 样式单词类别,因此整个单词可能会返回零或为 `café` 等术语产生令人惊讶的边缘位置。搜索词中的标点符号可能会导致同样的不匹配。
在批量编辑之前测试确切的语言和拼写,尤其是包含重音符号、撇号或连字符的名称。边界断言仅比较相邻的字符类别;它不知道排版是否构成了一个人类单词。如果示例失败,请针对这些环境使用故意设计的正则表达式,而不是信任该复选框。
JavaScript 单词边界让您感到惊讶的地方:ASCII 样式的单词字符不是语言单词
该工具确实提供了一个单独的区分大小写的选项,这与界面中不存在大小写处理的任何含义相反。清除它会添加 JavaScript 的不区分大小写标志。然而,该实现仅使用全局匹配以及可选的不区分大小写;它不添加 Unicode、多行、全点、粘性或其他标志。
本文也不会将 `` 转换为 Unicode 感知边界或解决特定于语言的标记化。 JavaScript 属性转义在这里不能替代,因为该工具不编译带有 Unicode 标志的模式。对于多语言编辑工作,建立明确的测试用例并选择所使用的浏览器引擎支持的模式。
工具中存在案例选项; Unicode 感知的字边界不
整个单词是一个组合规则,而不是第二个替换引擎。文字模式逃避搜索;正则表达式模式保留它;那么相同的非捕获组和两个边界包围任一结果。该顺序保护文字标点符号,并使 `cat|dog` 等正则表达式替代品表现为一个有界表达式。
当独立 ASCII 样式术语是预期目标时使用该选项,然后将替换计数和撤消控制视为保护措施而不是装饰。打开 ToolAcre 的查找和替换,针对独立示例和嵌入式示例测试替换,并且仅在这些示例按预期运行后将其应用于完整文档。