regex - 将多个正则表达式组合成一个/构建小正则表达式以匹配一组固定字符串

标签 regex algorithm optimization google-analytics

情况:

我们创建了一个工具 Google Analytics Referrer Spam Killer ,它会自动向 Google Analytics 添加过滤器以过滤掉垃圾邮件。

这些过滤器排除来自某些垃圾邮件域的流量。现在我们的列表中有 400 多个垃圾域。

为了删除垃圾邮件,我们添加了一个正则表达式(如 domain1.com|domain2.com|..)作为 Analytics 的过滤器,并告诉 Analytics 忽略与此过滤器匹配的所有流量。

问题:

Google Analytics 对每个正则表达式有 255 个字符的限制(每个过滤器一个正则表达式)。因此,我们必须创建大量过滤器来添加所有 400 多个域(现在有 30 多个过滤器)。问题是,还有另一个限制。每天的写操作数。每个新过滤器都是 3 个以上的写入操作。

问题:

我想找到最短的正则表达式来精确匹配另一个正则表达式。

例如你需要匹配以下字符串:

`abc`, `abbc` and `aac`

您可以将它们与以下正则表达式匹配:/^abc|abbc|aac$//^a(b|bb|a)c$//^a(bb?|a)c$/等。

基本上我正在寻找一个与 /^abc|abbc|aac$/ 完全匹配但长度较短的表达式。

我找到了 multiregexp ,但据我所知,它不会根据我可以在 Analytics 中使用的另一个表达式创建新的正则表达式。

有没有可以优化正则表达式长度的工具?

最佳答案

我找到了这个在 Linux 上编译的 C 工具:http://bisqwit.iki.fi/source/regexopt.html

super 简单:

$ ./regex-opt '123.123.123.123'
(123.){3}123

$ ./regex-opt 'abc|abbc|aac'
(aa|ab{1,2})c

$ ./regex-opt 'aback|abacus|abacuses|abaft|abaka|abakas|abalone|abalones|abamp'
aba(ck|ft|ka|lone|mp|(cu|ka|(cus|lon)e)s)

我无法运行@sln 建议的工具。它看起来像是一个更短的正则表达式。

关于regex - 将多个正则表达式组合成一个/构建小正则表达式以匹配一组固定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31945765/

相关文章:

c# - 非贪婪负后视

java - 用 Java 实现的最佳模式匹配算法

r - 无法从 R 中的数据框中绘制不同类型的变量

c++ - 最好不要相信 gcc 默认内联程序?

java - JAVA 中字符串中的搜索模式

javascript - 需要一些正则表达式帮助 javascript

javascript - HackerRank 上的道路和图书馆 (DFS) 超时

c++ - 从 vector 创建树

mysql - 优化查询以返回行数

针对极慢查询的 MySQL 查询优化