Java 根据一个地址有效地检查多个ip地址

Java 根据一个地址有效地检查多个ip地址,java,regex,performance,Java,Regex,Performance,我有一个字符串形式的ip地址列表,还有一个字符串格式的地址来检查这些地址。我的目标是找出我的地址是否在列表中。为了避免这种情况,这些ip地址不是完整地址,而是正则表达式。e、 g.10\.25\.3 在单个字符串上运行数百个正则表达式模式的最有效方法是什么?管道?搜索树?一个特定的java容器可以帮助我吗? 你有什么建议吗 编辑: 在处理之前,我可以将地址列表转换并存储为任何内容,这无关紧要。您可以尝试使用whois服务器的原始部分快速查找匹配项。它允许您构建范围树,并以极其高效的方式导航该树

我有一个字符串形式的ip地址列表,还有一个字符串格式的地址来检查这些地址。我的目标是找出我的地址是否在列表中。为了避免这种情况,这些ip地址不是完整地址,而是正则表达式。e、 g.10\.25\.3
在单个字符串上运行数百个正则表达式模式的最有效方法是什么?管道?搜索树?一个特定的java容器可以帮助我吗? 你有什么建议吗

编辑: 在处理之前,我可以将地址列表转换并存储为任何内容,这无关紧要。

您可以尝试使用whois服务器的原始部分快速查找匹配项。它允许您构建范围树,并以极其高效的方式导航该树

例如:

    // create & populate whitelist/blacklist tree
    NestedIntervalMap<Ipv4Resource, Boolean> map = new NestedIntervalMap<>();
    map.put(Ipv4Interval.parse("192.168/19"), true);
    map.put(Ipv4Interval.parse("192.168.52.1"), false);
    map.put(Ipv4Interval.parse("0/0"), false);

    // lookup if incoming IP is allowed to connect
    boolean allow = map.findFirstLessSpecific(new Ipv4Interval(incomingSocket.getInetAddress()));
//创建并填充白名单/黑名单树
NestedIntervalMap=新的NestedIntervalMap();
map.put(Ipv4Interval.parse(“192.168/19”),true;
map.put(Ipv4Interval.parse(“192.168.52.1”),false);
map.put(Ipv4Interval.parse(“0/0”),false);
//查找是否允许连接传入IP
boolean allow=map.findFirstLessSpecific(新的Ipv4Interval(incomingSocket.getInetAddress());

IP地址是前缀还是任意通配符字符串?它是一个前缀列表,如:10\.25\.3 108\.28\.4…如果您的地址列表确实是一个正则表达式列表,我会尝试将它们与您的字符串匹配。当你找到一个正匹配的时候,你可以停下来。但是对于一个每天截获数千个请求的拦截器来说,这是一个好办法。如果我每次都对所有请求运行所有检查,它会影响性能,不是吗?要匹配前缀,您应该能够使用树集来表示前缀列表。不是reg ex,而是普通前缀字符串(
“10.25.3.”
)。然后使用查找“最佳”匹配前缀,并检查它是否确实是给定字符串的前缀。复杂性是O(log(n)),其中n是列表中前缀的数量。