java 优化 正则_java – 优化正则表达式

我正在使用以下代码从连接到大型ISP网络的路由器丢弃不支持的物理接口/子接口(大的意思是成千上万的路由器):

private final static Pattern INTERFACES_TO_FILTER =

Pattern.compile("unrouted VLAN|GigabitEthernet.+-mpls layer|FastEthernet.+-802\\.1Q vLAN subif");

// Simplification

List 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层和802.1Q,未路由的VLAN不支持.

解决方法:

有一些字符串搜索算法允许您尝试以比明显的O(n * k)成本更便宜的k字符串搜索长度为n的字符串.

它们通常将滚动哈希与您单词的现有哈希列表进行比较.这方面的一个主要例子是Rabin-Karp algorithm.维基页面甚至有一个关于此的部分.还有更高级的原理版本,但很容易理解这个原理.

不知道Java中是否已经存在这样做的库(我想是这样的),但这就是我要尝试的 – 尽管这里有5个字符串相当小(不同的大小也使它更复杂).所以最好检查一个好的KMP字符串搜索是不是更快 – 我认为这是迄今为止最好的解决方案(默认的java api使用了一个天真的字符串搜索,所以使用一个lib)

关于你的正则表达式:回溯性能关键搜索代码的正则表达式实现?我怀疑这是个好主意.

PS:如果你为你的问题发布一个测试集和一个测试工具,很可能人们会看到他们能够击败最喜欢的东西 – 以前工作过..人性很容易欺骗:)

标签:java,regex,optimization

来源: https://codeday.me/bug/20190826/1731715.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值