【IM】【Android】业务上删除文字中的敏感词汇

59 阅读1分钟

直接上代码

/**  
* 截取处理敏感词  
*  
* @param text text  
* @return 处理后的文字  
*/  
public static CharSequence replaceSensitiveWords(CharSequence text) {  
    List<String> words = new ArrayList<>();  
    Realm realm = BaseApp.inst().realm;  
    for (SensitiveWordRealm sensitiveWordRealm : SensitiveWords) {  
        words.add(Pattern.quote(sensitiveWordRealm.keyWord));  
    }  
    words.sort(Comparator.comparingInt(String::length).reversed());  
    CharSequence result;  
    String sensitiveWordsRegex = "(" + String.join("|", words) + ")";  
    Pattern pattern = Pattern.compile(sensitiveWordsRegex, Pattern.CASE_INSENSITIVE);  
    Matcher matcher = pattern.matcher(text);  
    result = matcher.replaceAll("");  
    return result;  
}

解释一下重点位置:

1.public static String Pattern.quote(String s)方法,为每一个敏感词增\Q前缀和\E后缀,此方法生成一个String,可用于创建与字符串s匹配的Pattern字符串,就好像它是文本模式一样。 输入序列中的元字符或转义序列不会被赋予任何特殊含义。

  1. 进行排序:按照敏感词从长到短的进行排序,之后用正则去匹配并删除的时候,可以完全过滤掉。

    例如:

    • 一段文字:"我今天想去天津吃嘎巴菜和老豆腐。"
    • 敏感词汇有:嘎巴菜,嘎巴菜和老豆腐,共两个。

    如果短词在前的正则表达式为:(\Q嘎巴菜\E|\Q嘎巴菜和老豆腐\E)

    这样匹配并移除后的文字是:“我今天想去天津吃和老豆腐”。因为第一次匹配“嘎巴菜”已经被删除了,再次匹配“嘎巴菜和老豆腐时”就找不到了。无法删除了呢。

    如果长词在前的正则表达式为:(\Q嘎巴菜和老豆腐\E|\Q嘎巴菜\E)

    这样匹配并移除后的文字是:“我今天想去天津吃”。这才是我们想要的结果