文本和日常工具·文本工具包
为什么 ^ 和 $ 只匹配一次:浏览器中的正则表达式标志查找和替换
· 工作原理
正则表达式 查找和替换 文本清理
解释了 JavaScript 正则表达式标志 - 全局、多行和 dotAll - 以及为什么查找和替换框在没有多行锚点 ^ 和 $ 的情况下编译到整个文本,而是使用有效的模式。
仅修复第一行的模式 - 当您期望 ^ 表示“每行的开头”时会发生什么
粘贴的列表可能在每一行中包含相同的不需要的前缀,但搜索 `^prefix` 只会将其从第一行中删除。令人惊讶的结果来自模式配置,而不是不一致的数据。在 ToolAcre 中,`^` 标识完整文本的开始,因为正则表达式是在没有多行模式的情况下编译的。
匹配的 `$` 锚点在另一条边缘遵循相同的规则:它标识完整文本的结尾,而不是其中结尾的每一行。换行符仍然是输入的一部分,但不会成为另一个锚点位置。在导入清理列表之前检查报告的替换计数;计数到一就会立即暴露出不匹配的情况。
g 标志 — 为什么“一次替换所有匹配项”取决于设置的全局标志
ToolAcre 始终使用全局 `g` 标志构建其搜索模式。这个选择告诉 JavaScript 收集每个不重叠的匹配项,而不是在第一个匹配项之后停止。该工具首先调用 `match` 来确定计数,然后将相同的全局模式传递给 `replace`,因此显示的数字和替换传递使用一个匹配规则。
全局匹配无法创建模式无法识别的位置。对于 `^prefix`,只有一个符合条件的全文开头,因此 `g` 仍会找到一个匹配项。对于可以出现在多行上的模式,`g` 允许替换所有出现的情况。调试时将这些问题分开:锚点决定匹配可以从哪里开始,而全局模式决定搜索是否继续。
m 标志 — 多行如何将 ^ 和 $ 从全文本锚点更改为行锚点,以及为什么该工具忽略它
多行 `m` 标志更改 `^` 和 `$` 的解释方式,允许它们识别行终止符周围的位置以及外部文本边界。 ToolAcre 没有添加该标志。其编译器使用 `g` 进行区分大小写的搜索,并在清除区分大小写时使用 `gi`,而用户无法控制其他标志。
使多行不可用会使界面变小,但这意味着从配置有 `gm` 的编辑器复制的模式在此处可能表现不同。不要假设一个熟悉的表达方式带有它的标志。创建 RegExp 时会提供 JavaScript 标志字母,并且该工具会拒绝不受支持的内联标志语法,而不是默默地启用另一种模式。
s 标志 — 为什么点默认不匹配换行符,以及如何在没有它的情况下跨行匹配
此工具中的点与换行符不匹配,因为编译器还忽略了 dotAll `s` 标志。当两个标记都在一行上时,诸如 `BEGIN.*END` 之类的模式可以匹配,但当标记跨越多行时,它会在第一个换行符处停止。添加全局模式不会改变点本身可以消耗的内容。
当确实需要跨行匹配时,请明确写入允许的字符。像 `[\s\S]*?` 这样的类可以跨越空白和非空白,同时仍然不情愿,尽管广泛的模式值得首先在小样本上进行测试。编译器会捕获无效语法,但它不会保护选项卡免受具有严重回溯行为的昂贵表达式的影响。
显式匹配换行符 - 当多行不可用时,在模式中使用 \n 来定位行的开始和结束
对于没有多行模式的重复行开头,请匹配文本的开头或换行符:`(^|\n)prefix`。第一个替代方案处理第一行,第二个替代方案通过消耗其前面的换行符来处理后面的行。括号捕获匹配的边界,为替换提供了保留分隔行的结构的方法。
该技术假定模式中存在换行分隔符。文本库在执行专用行操作时识别 CRLF、LF 和单独的 CR,但查找和替换直接搜索原始字符串。如果粘贴的内容使用其他行结束形式,请先对其进行规范化或有意调整表达方式;否则后面的行可能保持不变,即使它们在屏幕上看起来相同。
使用 (^|\n) 显式匹配行边界并保留捕获的分隔符
假设输入为 `ID: apple`、`ID: pear` 和 `ID: plum`,位于不同的行上。启用正则表达式,找到 `(^|\n)ID: `,并替换为 `$1`。在第一行,`$1` 是空的起始位置;在后面的行中,它是捕获的换行符。标签消失,而所有三行边界保持不变。
在接受结果之前读取替换计数。在此示例中,三行应产生三个替换。如果计数为 1,请检查实际模式和行结尾,而不是重复操作。替换后可以进行撤消,因此在同一表达式接触较长的导入列表之前,进行一次小型试验即可确认匹配和重建。
这不包括 - u、i 和 y 标志,以及在替换中插入换行符,这是单行字段无法做到的
当关闭区分大小写时,该实现还会使用 `i`,但它不公开对 `u`、`y`、`m` 或 `s` 的控件。除了解释示例所需的缺少的多行和 dotAll 效果之外,本文不会将行为分配给那些不可用的模式。来自另一个 JavaScript 环境的模式必须根据 ToolAcre 实际编译的标志进行审查。
源代码证明替换文本已传递给 JavaScript `String.replace`,因此 `$1`、`$&` 和 `$$` 等替换保留其 JavaScript 含义。它不会根据此处使用的文件建立渲染字段提供的所有交互。特别是,应测试通过界面插入物理换行符,而不是仅从大纲中推断。
其他标志和替换字段行为不在此工具实现之外
将标志视为正则表达式的一部分,即使界面仅显示模式主体也是如此。在 ToolAcre 中,每次搜索都是全局的,可选的不区分大小写模式添加 `i`,并且不存在 multiline 和 dotAll。这些事实解释了为什么在普通匹配中继续替换,而 `^`、`$` 和点保留其默认的全文本和单行约束。
对于带前缀的粘贴列表,`(^|\n)prefix` 和 `$1` 是实际的解决方法,因为它命名边界并保留它。从代表性行开始,确认计数,检查生成的行结构,然后才处理完整的数据集。该过程将令人费解的一场比赛结果转变为导入前可审查的清理步骤。