常用屏蔽字符的处理方法

来源:互联网 发布:淘宝鱼具渔具垂钓用品 编辑:程序博客网 时间:2024/05/08 12:34

一、功能介绍:在不改变原有的字符串格式的基础上,实现对屏蔽字的处理。

二、代码实现:

/**     * 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算法对该方法做进一步优化.如有好的建议,留言.

0 0
原创粉丝点击