關於字符串截取與匹配
阿新 • • 發佈:2018-07-03
部分 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暴力匹配比樹形結構的消耗更優。
相當於做了無用功,看以後是否能夠做文本匹配,是否能夠更加節省時間。
關於字符串截取與匹配