Skip to content

Aho–Corasick / exact text matching

一个词典。
一次扫描。
每一处命中。

用原文字素匹配多个关键词,以可直接切片的范围处理命中。观察每次转移、回退,以及后缀如何成为结果。

he · she · his · hers
ushers → she, he
ushers → hers
search('ushers')
{ pattern: 'she', start: 1, end: 4 }
text.slice(1, 4) === 'she'

本站介绍已在 npm 发布的 v3.2.0。 MIT · SonOfMagic · BrunoRB/ahocorasick

3.2.0当前版本
grapheme-first匹配单位
UTF-16可直接切片的范围
0运行时依赖

从任务开始

每一种文本处理,都有对应的入口。

先选需要的结果,再随着应用增长继续复用同一个匹配器。

需要记住的契约

匹配原文,也保留原文坐标。

每个结果都使用左闭右开的 UTF-16 范围,因此命中文本始终可以用 text.slice(start, end) 取得。Emoji、组合字符和 CRLF 都会作为完整字素处理。

阅读 Unicode 与索引指南 →
const text = '😀 café'
const hit = new AhoCorasick(['café']).search(text)[0]
text.slice(hit.start, hit.end)
// 'café'

继续探索

从第一次匹配,到完整的生产流水线。

MIT · Based on BrunoRB/ahocorasick