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

时间:2015-08-11 15:19:48

标签: regex algorithm optimization google-analytics

情况:

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

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

要删除垃圾邮件,我们会将正则表达式(例如domain1.com|domain2.com|..)添加为Google Analytics过滤器,并告知Google 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,但就我所知,它并没有从我可以在Google Analytics中使用的另一个表达式创建一个新的正则表达式。

是否有可以针对长度优化正则表达式的工具?

2 个答案:

答案 0 :(得分:1)

我发现这个C工具在Linux上编译:http://bisqwit.iki.fi/source/regexopt.html

超级简单:

$ ./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建议的工具。它看起来像是一个更短的正则表达式。

答案 1 :(得分:0)

我不知道用于组合/压缩/优化正则表达式的现有工具。可能有一个。也许通过从正则表达式构建一个有限状态机,然后从中生成一个正则表达式?

对于任意正则表达式的一般情况,您不需要解决问题。我认为,创建紧凑的正则表达式以匹配给定的一组固定字符串是更好的选择。

可能已经存在一些现有的代码,用于使优化的正则表达式匹配给定的一组固定字符串,同样是IDK。

要自己动手,最简单的方法是对字符串进行排序并查找公共前缀/后缀。 ((afoo|bbaz|c)bar.com)。在中间寻找常见的字符串并不容易。您可能希望查看用于无损数据压缩的算法以查找冗余。

理想情况下,您希望找到可以使用foo[a-d]范围而不是foo(a|b|c|d)以及其他各种内容的情况。