情况:
我们创建了一个工具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中使用的另一个表达式创建一个新的正则表达式。
是否有可以针对长度优化正则表达式的工具?
答案 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)
以及其他各种内容的情况。