一、功能介绍:在不改变原有的字符串格式的基础上,实现对屏蔽字的处理。
二、代码实现:
/**
* List<Character> 转字符串的方法
* @param in
* @return
*/
public static String characterListToString(List<Character> in) {
String result = "";
for (char b : in) {
result += b;
}
return result;
}
/**
* 从content的startIndex的位置开始向后处理含有mode的子字符串
* @param content
* @param startIndex
* @param mode
* @return
*/
public static Object[] next(String content, int startIndex, String mode) {
Object[] result = new Object[3];
char[] ss = content.toCharArray();
List<Character> all = new ArrayList<>();
List<Character> in = new ArrayList<>();
for (int i = startIndex; i < ss.length; i++) {
all.add(ss[i]);
if (ss[i] == ' ') {// 空格不做处理(可以扩展到任意不做处理的字符,还需要修改的地方已标记(★))
continue;
}
in.add(ss[i]);
if (in.size() == mode.length()) {
String temp = characterListToString(in);
if (temp.contains(mode)) {
result[0] = true;// 是否含有非法子字符串
result[1] = all;// 在原字符串中的子字符串
result[2] = i;// 结束的位置(作为下次的起始点)
return result;
} else {
while (all.get(0) == ' ') {// here★
all.remove(0);
}
all.remove(0);
in.remove(0);
}
}
}
result[0] = false;
return result;
}
/**
* 处理content字符串 ,mode为非法字符串
* @param content
* @param mode
* @return
*/
public static String charShielding(String content, String mode) {
if (mode.length() > content.length()) {// 非法字符长度大于内容时不作处理
return content;
}
int startIndex = 0;
while (1 != 0) {// 循环处理
Object[] result = next(content, startIndex, mode);
if ((boolean) result[0]) {
@SuppressWarnings("unchecked")
List<Character> all = (List<Character>) result[1];
char[] rc = new char[all.size()];
for (int i = 0; i < rc.length; i++) {
rc[i] = '*';
}
String rs = new String(rc);
content = content.replace(characterListToString(all), rs);
startIndex = (int) result[2] + 1;// 此次结尾的位置+1 即为下次的开始位置
} else {
break;
}
}
return content;
}
//测试
public static void main(String args[]) {
String text = "闲 来垂钓碧溪上,忽 复 乘舟梦日边。闲 来垂钓碧溪上,忽 复乘舟梦日边。";
List<String> disallowStrList = new ArrayList<>(Arrays.asList("日", "忽复乘", "闲来"));
for (String str : disallowStrList) {
text = charShielding(text, str);
}
System.out.println(text);
}
运行结果:*****垂钓碧溪上,********舟梦*边。***垂钓碧溪上,*****舟梦*边。
总结:
突然间需要这个功能就粗糙的写了一个方法. 等有时间可以看看是否可以结合KMP算法对该方法做进一步优化.如有好的建议,留言.