【富文本之有序列表】正则实现有序列表的EditText编辑

以下为原生实现 如果你的富文本编辑更复杂可转看

Android富文本编辑器进阶版(干货,IOS可照搬逻辑)

Edittext实现功能

1.每插入一个序号累加

2.中间插入序号,后面的序号相应递增

3.中间删除序号,后面的序号相应递减

4.删除定义的有序列表样子整个删除 如<66> 删除“>”则整个删除

*不是最简单算法,我的最后一步是先替换成中间统一标签-1,然后再排序

本文以“·number、样式的有序列表为例(我现在项目需求是这样的~),也可以替换成<number>”纯数字也可看需求规则是什么

核心正则

    //让符合规则序号重新排列
    public String getOrderedList(String string) {
        String pattern = "·-\\d+、|·\\d+、";
        //先重置
        string = string.replaceAll(pattern, "·" + -1 + "、");
        //后排序
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(string);
        int i = 0;
        while (m.find()) {
            String rep = "·" + ++i + "、";//实际增加长度
            string = string.replaceFirst(m.group(), rep);
        }
        return string;
    }
    public String clearUnOrderedList(String string) {//不符合样式的皆删除
        String pattern = "·\\d+[^、]|[^·]\\d+、";
        string = string.replaceAll(pattern, "");
        return string;
    }

 

 

 

 

 

功能1:普通增加

 

  private void addPoint() {
    
        String order_tag = "\n\n·" + -1 + "、";//换两行方便看\n
        int pStart = etChat.getSelectionStart();//获取光标位置point

        int oldLen = etChat.getText().toString().length();
    
        etChat.getText().insert(pStart, order_tag);

        etChat.setText(getOrderedList(etChat.getText().toString()));
        int newLen = etChat.getText().toString().length();

        //移动光标实际增加距离
        etChat.setSelection(pStart + newLen - oldLen);

    }

功能2:中间插入

getOrderedList中已经实现,不该什么变化先占一个位置,后面统一排序

 string = string.replaceAll(pattern, "·" + -1 + "、");

 

功能3,4:删除中间排序,删除样式的一部分则整个删除

     etChat.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (before>0) {
                    int pStart = etChat.getSelectionStart();
                    int oldLen = s.toString().length();
                    etChat.needChange();
                    String newStr = clearUnOrderedList(s.toString());
                    String orderedList = getOrderedList(newStr);
                    int newLen = orderedList.length();
                    etChat.setText(orderedList);
                    etChat.setSelection(pStart + newLen - oldLen);
                }

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值