多正则表达式匹配的应用
搜索引擎 Query 分析
Query 意图分析
定义一批规则(正则表达式),每条规则表达一种搜索的意图,例如问路、吃饭、看病、查找ip、查找电话、小说、软件下载……
Query 改写
定义一批规则(正则表达式),每条规则,使用一种方法/策略去变换/改写用户 Query,以改善用户体验
敏感词过滤/扫描
如果所有的敏感词都是一个个精确的词,那直接用 AC 自动机 就可以解决,速度快,内存占用还小。
但是,如果有一些敏感词是正则表达式,比如 POWER 8 极限算法挑战赛第二期 —— 敏感词大数据过滤;这只是一个小比赛,现实中的情况更加严酷!
网络安全
- 协议识别,如 l7-filter 等
- 入侵检测,深度包检测,等等,有些场景还有例外排除规则,正好使用 并、交、差 功能
文本编辑
简单替换
多正则批量替换,使用 unix sed 可以批量修改文本文件,但是,当需要将不同的 Source 替换成不同的 Destination 时,sed 只能一趟又一趟地去替换。使用多正则匹配,一趟就可以完成。
复杂替换
TODO:
日志分析
很多时候,同一个日志文件中包含多种格式不同的日志,要对每种日志,调用不同的分析函数。使用多正则匹配,扫描一遍,就可以知道是哪种日志。
Web服务器
一般的 Web 服务器都有 url rewrite 功能,例如 Apache 服务器几乎可以配置任意复杂的 url rewrite 规则,但是它们使用的都是非常低效的算法:逐个遍历匹配。虽然它们做了一些分组,使得同一组(目录)内规则数量很小,这在大部分情况下都工作的不错,但是一旦碰到组内规则太多时,就会显著降低性能。有了多正则匹配算法,这个问题根本就是小菜一碟。
URL 分析
场景1
某搜索引擎收集了大量的网页,其中很多网页的 url 至少有两种形式:PC版url 和 手机版URL,要识别这种对应关系,人工定义了几十万个正则表达式,这个规则库还在迅速增加中……
场景2
某搜索引擎需要对网页中的 url 链接做归一化,定义了几万条归一化规则(正则表达式),而且还有例外排除规则,这个规则库也在迅速增加中……
在这个场景下,除了多正则匹配,还需要 并、交、差 功能