常用屏蔽字符的处理方法

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

二、代码实现:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值