文本匹配字段,split快还是正则表达式快

需要统计一段文本中“【名称】”出现的次数。

两种方法,一种是用String的split,另一种是用正则表达式。

结果发现是正则表达式更快,快了1倍。

    // 正则
    public static int count(String text, String targetWord) {
        Pattern pattern = Pattern.compile(targetWord);
        Matcher matcher = pattern.matcher(text);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        return count;
    }

    // String的split
    public static int count1(String text, String targetWord) {
        String[] split = text.split(targetWord);
        return split.length;
    }

开始运行:

    public static void main(String[] args) {
        long l = System.currentTimeMillis();
        String text = "【名称】案件聚焦军【名称】";
        StringBuffer t = new StringBuffer();
        for (int i = 0; i < 10000; i++) {
            t.append(text);
        }
        String targetWord = "【名称】";
        int count = count(t.toString(), targetWord);  //正则 20000  time: 9
        // int count = count1(t.toString(), targetWord); //split 20000  time: 21
        System.out.println(count);
        long l1 = System.currentTimeMillis();
        System.out.println("time: " + (l1 - l));
    }

我们可以看到结果:“【名称】”出现的次数都对的上,都是20000次。运行时间的话,正则是9ms,String的split是21ms,正则快了1倍多。

而且split的计算不一定准确,如果“【名称】”不在开头,还需要将length减1,正则的就比较准确

而且正则的可以支持多个字段targetWord的匹配,代码如下:

    public static int count(String text, List<String> targetWords) {
        String targetWord = String.join("|", targetWords);
        Pattern pattern = Pattern.compile(targetWord);
        Matcher matcher = pattern.matcher(text);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        return count;
    }

开始运行:

    public static void main(String[] args) {
        long l = System.currentTimeMillis();
        String text = "【名称】案件聚焦军【名称】【你好】";
        StringBuffer a = new StringBuffer();
        for (int i = 0; i < 10000; i++) {
            a.append(text);
        }
        List<String> targetWords = new ArrayList<>();
        targetWords.add("【名称】");
        targetWords.add("【你好】");
        int count = count(a.toString(), targetWords); // 正则 30000 time: 10
        System.out.println(count);
        long l1 = System.currentTimeMillis();
        System.out.println("time: " + (l1 - l));
    }

输出是目标字段出现30000次,时间是10ms。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值