【发布时间】:2012-01-30 02:22:09
【问题描述】:
我正在使用以下代码从连接到大型 ISP 网络(我指的是数万个路由器)的路由器中丢弃不受支持的物理接口/子接口:
private final static Pattern INTERFACES_TO_FILTER =
Pattern.compile("unrouted VLAN|GigabitEthernet.+-mpls layer|FastEthernet.+-802\\.1Q vLAN subif");
// Simplification
List<String> interfaces;
// lots of irrelevant code to query the routers
for (String intf : interfaces) {
if (INTERFACES_TO_FILTER.matcher(intf).find()) {
// code to prevent the interface from being used
}
}
这个想法是丢弃以下条目:
- GigabitEthernet2/11.2000 的未路由 VLAN 2000
- GigabitEthernet1/2-mpls 层
- FastEthernet6/0/3.2000-802.1Q vLAN subif
这段代码在大量接口(一些路由器有 50k+ 子接口)上经常被命中(每分钟几次),缓存也没有太大帮助,因为新的子接口经常被配置/丢弃。该计划是优化正则表达式,以便该过程完成得更快一点(每一纳秒都很重要)。各位大神能指教一下吗?
注意: mpls layer 和 802.1Q 支持其他类型的接口,unrouted VLANs 不支持。
【问题讨论】:
-
为什么不先隔离应该匹配的字符串并检查一下
-
您是否尝试过仅使用 String.contains 而不是正则表达式?
-
您提供的那些条目是整行还是取自行中间的一些单词?
-
我不知道,但很容易测试它是否值得。您也可以使用 indexOf 并仅测试在“GigabitEthernet”+ 15 的索引之后找到“-mpls ayer”(15 是“GigabitEthernet”的长度)
-
那么
matches()也不能正常工作这不会在每个位置都尝试(仅尝试 1 个匹配而不是intf.length())
标签: java regex optimization