【发布时间】:2016-06-02 08:54:39
【问题描述】:
我有很多日志,每条记录都包含一个 url。而且我有大约 2000 多个 url 模式来过滤日志。一些模式是具有可捕获组的规则模式。我想获取 url 和匹配的模式,如果可能的话,还想获取捕获的组。有没有java lib可以帮助我。或任何可以解决我的问题的算法。或任何其他与我的问题有关的东西。非常感谢。
【问题讨论】:
标签: algorithm pattern-matching finite-automata
我有很多日志,每条记录都包含一个 url。而且我有大约 2000 多个 url 模式来过滤日志。一些模式是具有可捕获组的规则模式。我想获取 url 和匹配的模式,如果可能的话,还想获取捕获的组。有没有java lib可以帮助我。或任何可以解决我的问题的算法。或任何其他与我的问题有关的东西。非常感谢。
【问题讨论】:
标签: algorithm pattern-matching finite-automata
看看 java 正则表达式库 (link)。
您可以通过将原始模式与它们之间的| 连接起来来构造一个大模式(使用() 来指定您不只需要1 个字符)。
正则表达式可以编译成高效的匹配有限自动机,您可以在数据上运行。只需确保编译一次并为每条记录重复使用它。
它将处理提取组,但您需要以通用方式处理组(因为可以匹配任何组)。如果它更容易考虑使用命名组来简化处理。
【讨论】:
(?<name>X) 以匹配 X 和名称 name。然后当你得到结果时Mathcher.group("name")。您必须遍历您分配的名称并全部请求它们。对于与函数不匹配的组,将进行哈希查找并返回 null(会很快)。这不需要再次遍历输入字符串,因此它仍然比为每个模式使用单独的正则表达式要快得多。