直接上代码
/**
* 截取处理敏感词
*
* @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字符串,就好像它是文本模式一样。
输入序列中的元字符或转义序列不会被赋予任何特殊含义。
-
进行排序:按照敏感词从长到短的进行排序,之后用正则去匹配并删除的时候,可以完全过滤掉。
例如:
- 一段文字:"我今天想去天津吃嘎巴菜和老豆腐。"
- 敏感词汇有:嘎巴菜,嘎巴菜和老豆腐,共两个。
如果短词在前的正则表达式为:
(\Q嘎巴菜\E|\Q嘎巴菜和老豆腐\E)。这样匹配并移除后的文字是:“我今天想去天津吃和老豆腐”。因为第一次匹配“嘎巴菜”已经被删除了,再次匹配“嘎巴菜和老豆腐时”就找不到了。无法删除了呢。
如果长词在前的正则表达式为:
(\Q嘎巴菜和老豆腐\E|\Q嘎巴菜\E)。这样匹配并移除后的文字是:“我今天想去天津吃”。这才是我们想要的结果