从长列表中生成最小正则表达式

时间:2018-01-23 08:59:39

标签: java regex

我有一长串网址的url路径(~180000)。在我当前的项目中,我想过滤掉前缀匹配其中一个条目的所有传入路径。

数据非常同质:80%的条目类似于"/abc/<id1>.<id2>/<id3>"。即使其余部分也可以完美地分组为正则表达式,但是为180k条目手动执行此操作并不值得。

是否有自动解决方案(对于Java)从该列表生成最小的正则表达式?

在CS理论中,可以从所有条目构建DFA并尝试将其最小化,并将结果转换为正则表达式。但现有的库是否提供该功能?

我也会接受任何匹配列表中合理超集的库(因此,即使样本中id1只显示[0-8] *,[0-9] *也可以作为正则表达式使用太)。

1 个答案:

答案 0 :(得分:0)

如果我读得正确,那么您应该能够遍历URL并检查前缀:

List<String> keep = new ArrayList<>();

for (String url : urls) {
    if (url.matches("^/abc/<id1>.<id2>/<id3>.*")) {
        keep.add(url);
    }
}