1. 程式人生 > >關於字符串截取與匹配

關於字符串截取與匹配

部分 art 文本 。。 漢字 禁止用戶 targe mat 用戶

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

如題:想采用樹形結構對字符串進行截取並匹配名,最後發現結果無疾而終。

需求描述:公司想對於用戶在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的字串中放入大概萬字文本內容。

鏈接:https://www.cnblogs.com/cswxl/p/9259853.html

經過測試發現,從原理上來說,如果能夠匹配成功,樹形結構的消耗一定會小於直接匹配的消耗。但是在這個過程中就要考慮樹形結構,自身截取字符串的過程中也需要消耗時間。

針對於靜態的字符串,最大的長度是65534,現在定義的text文本的長度為一萬字左右,(已滿)(一個漢字對應8個字節,中間出現有數字逗號等占容量比較少的字符)

通過比對發現,實際的實現過程中,如果註釋掉樹形結構的部分,那麽兩者消耗相抵消,甚至java自帶的contains暴力匹配比樹形結構的消耗更優。

相當於做了無用功,看以後是否能夠做文本匹配,是否能夠更加節省時間。

關於字符串截取與匹配