Fitting a regular expression to a list of words
2 days ago
- grep 可以使用 `-f` 标志从文件输入搜索单词列表,并使用 `-F` 进行固定字符串搜索,例如搜索 ICD-10 诊断代码。
- 当通过 `-f` 提供大量模式时,由于正则表达式大小限制,ripgrep 可能会失败并显示“编译的正则表达式超出大小限制”错误。
- 可以将多个搜索词组合成一个正则表达式,并通过使用特里树数据结构共享公共前缀来优化。
- Python 库 `trieregex` 可以从单词列表生成紧凑的正则表达式模式,例如以 'blue' 开头的单词生成 'blue(?:shield|cross|y)'。
- 基于特里树的优化适用于公共前缀,但不适用于公共后缀;例如,'javascript' 和 'typescript' 不会被压缩。
- 对于 HCPCS 代码,ripgrep 处理包含 8725 个代码的 17198 字符正则表达式比 grep 快约 1000 倍(0.078 秒对比 73.426 秒)。
- Perl 的正则表达式引擎通过特里树化原生优化交替匹配,使得手动压缩对于运行时效率变得不必要。