关于字符串截取与匹配

看似做了一下午的无用功。

如题:想采用树形结构对字符串进行截取并匹配名,最后发现结果无疾而终。

需求描述:公司想对于用户在app端输入的文本进行关键字过滤,如果出现了某个敏感词汇,那么就禁止发表内容。

比如:敏感词汇:"狗蛋",用户输入的文本内容:"某某某是狗蛋。。。。。。。。",则禁止用户发表某个内容。

树形结构如下图所示:

参考代码如下

public class Match {
    /**
     * @author 
     * date 11:03 2018/7/3
     * Description 判断输入的字符串和目标的子串是否匹配
     * 用target作为敏感词去匹配输入的文本串text
     */
    public static boolean Match(String target, String text) {
        //对获取到的字符串进行截取
        //获取text字符串的长度textLength
        Integer textLength = text.length();
        //先使用最简单暴力的匹配方式进行匹配,之后再引入KMP算法进行详细的解释
        String text1 = text.substring(0, textLength / 8);
        String text2 = text.substring(textLength / 8, 2 * textLength / 8);
        String text3 = text.substring(2 * textLength / 8, 3 * textLength / 8);
        String text4 = text.substring(3 * textLength / 8, 4 * textLength / 8);
        String text5 = text.substring(4 * textLength / 8, 5 * textLength / 8);
        String text6 = text.substring(5 * textLength / 8, 6 * textLength / 8);
        String text7 = text.substring(6 * textLength / 8, 7 * textLength / 8);
        String text8 = text.substring(7 * textLength / 8);
        if (text1.contains(target) || text2.contains(target) || text3.contains(target) || text4.contains(target)
                || text5.contains(target) || text6.contains(target) || text7.contains(target) || text8.contains(target)) {
            return false;
        }
        text1 = text1 + text2;
        text2 = text3 + text4;
        text3 = text5 + text6;
        text4 = text7 + text8;
        if (text1.contains(target) || text2.contains(target) || text3.contains(target) || text4.contains(target)) {
            return false;
        }
        text1 = text1 + text2;
        text2 = text3 + text4;
        if (text1.contains(target) || text2.contains(target)) {
            return false;
        }
        if (text.contains(target)) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String target = "狗蛋";
        String text = "";//此处可以放入word文本内容(会上传)
        //获取当前时间
        Long startTime =System.nanoTime();
        System.out.println(Match(target, text));
        //获取当前时间
        Long endTime =System.nanoTime();
        //输出系统运行的时间
        System.out.println(endTime-startTime);
    }
}

在text的字串中放入大概万字文本内容。

链接:文本内容

经过测试发现,从原理上来说,如果能够匹配成功,树形结构的消耗一定会小于直接匹配的消耗。但是在这个过程中就要考虑树形结构,自身截取字符串的过程中也需要消耗时间。

针对于静态的字符串,最大的长度是65534,现在定义的text文本的长度为一万字左右,(已满)(一个汉字对应8个字节,中间出现有数字逗号等占容量比较少的字符)

通过比对发现,实际的实现过程中,如果注释掉树形结构的部分,那么两者消耗相抵消,甚至java自带的contains暴力匹配比树形结构的消耗更优。

相当于做了无用功,看以后是否能够做文本匹配,是否能够更加节省时间。

原文地址:https://www.cnblogs.com/cswxl/p/9259843.html