首页 > 其他分享 >富文本实现打字效果

富文本实现打字效果

时间:2024-03-07 19:24:18浏览次数:26  
标签:curIdx string 效果 self 打字 正则 文本 match

正题

涉及到的知识有:正则,富文本,迭代器
不想看废话的请跳最后

Old Code

之前想实现这个效果,于是在搜索引擎上面搜,要么代码太长(看不懂),要么就是相同的。于是我翻到这一篇文章

富文本打字机效果-腾讯云开发者社区-腾讯云

大致原理是将文本a通过正则,将匹配到的用""替换掉纯文本b,通过反向遍历b元素,找到在a的位置,将这个位置的前面和后面的字符串(除了自己)拼接起来然后替换成a,将新数据压入栈中,直到遍历完;就会得到一个类似金字塔的效果(除去标签),如下。
image
只要之后拿到这个栈后不断的pop显示就会得到打字效果。但是我们会发现他是把结果存下来,先把所有结果算出来,此时弊端会出现了;占空间,开始算时会卡一下(如果异步的话那没问题)。但是我想我想要结果的时候再给我算一下,不需要全部算完(这样我中途跑路了,性能也会那么坏)。于是诞生了新的代码

New Code

也写了注释了,用迭代器的方式一次一次给,而且是正向搜索,复杂度比之前的好的多。
(我也好奇为什么他正则要写这种 /<.+?/?>/g 理论上 <.*?> 似乎就可以了)

public static IEnumerable<string> PrintRichTxT(this string self) {
    string regex = @"<.*?>";        // 正则
    Match match = Regex.Match(self, regex);
    int curIdx = 0; // 当前添加的位置
    string ans = string.Empty;
    while (curIdx < self.Length) {
        // 判断当前添加的位置是否是当前正则结果的开头索引
        while (match.Success && curIdx == match.Index) {
            ans += match.Value;
            curIdx += match.Length;     // 移动索引
            match = match.NextMatch();  // 获取下一个结果
        }
        // 判断越界问题
        if(curIdx < self.Length) {
            ans += self[curIdx];
            curIdx++;
        }
        yield return ans;
    }
}

标签:curIdx,string,效果,self,打字,正则,文本,match
From: https://www.cnblogs.com/onepeopleheart/p/18059553

相关文章

  • C# 控件长按效果
    1.使用计时器,定时执行变量自增加参考:https://www.cnblogs.com/dotnet261010/p/7113523.html2.对控件添加两个事件(MouseUp和MouseDown) MouseDown方法中重置计数且打开计时器MouseUp方法中去关闭计时器根据变量结果做延时触发。注意:notifyIcon不支持实例: 参考视频:https://......
  • Avalonia/Wpf 实现文字跑马灯效果
    WPF:<BorderWidth="100"Height="30"BorderBrush="Black"BorderThickness="1"><CanvasClipToBounds="True"><TextBlockText="HelloWorld"......
  • 大语言模型常见的文本切分之语义嵌入
    语料准备选择了一篇新闻稿,有比较明显的段落区分,每个段落由若干句子构成,可用于验证切分效果。#节气释义小寒,是二十四节气中的第二十三个节气,太阳到达黄经285度时开始。《月令七十二候集解》中说:“十二月节,月初寒尚小,故云。月半则大矣。”冷气积久而寒,小寒是天气寒冷但还没有......
  • 大语言模型常见的文本切分方式整理汇总
    整理本文整理了一些简单的文本切分方式,适用于大语言模型经典应用RAG或相似场景。一般切分如果不借助任何包,很容易想到如下切分方案:text="我是一个名为ChatGLM3-6B的人工智能助手,是基于清华大学KEG实验室和智谱AI公司于2023年共同训练的语言模型开发的。我的目标是......
  • a-modal使用hooks封装状态逻辑并添加全屏切换效果
    /hooks/useModal.jsimport{nextTick,ref}from'vue'import{isFunction}from"lodash-es";exportfunctionuseModal(){ //标题 //执行ok、cancel方法 constvisible=ref(false) constloading=ref(false) consthideModal=()=>{......
  • C# 控制台禁用快速编辑模式、在指定行更新文本、注册Ctrl+C事件处理器
    在第三行更新文本 代码如下usingMicrosoft.Win32.SafeHandles;usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;classProgram{[DllImport("kernel32.dll")]staticexternSafeFileHandleGetStdHandle(intnStdHandle);......
  • 文本处理
    目录文本处理一、文件打开与关闭1.os.open打开2.os.OpenFile打开(推荐)(1)flag参数(2)prem参数(文件权限)3.ioutil.ReadFile打开二、文件读取1.File.Read普通读取文件(1)简单读文件(2)循环读取文件2.bufio读取文件(1)分块读取(2)按行读取i.reader.ReadLine()ii.reader.ReadString('\n')ii......
  • div contenteditable="true" 添加placehoder效果
    <divclass="contain":style="{height:editableHeight+'px'}" v-html="innerText" ref="editableDiv" contenteditable="true" :placeholder=placeholder @input="inputTe......
  • 24. 执行卡牌效果
    目标当我打出一张攻击牌并指向敌人的时候,敌人会扣血代码攻击牌指向敌人当我在拖动牌指向敌人的时候,鼠标指向的地方会判断是否有东西,并且东西的标签是否是Enemy,是的话就标记为可执行,以及目标角色因为只有指向Tag为Enemy的对象才有效果,所以要给敌人添加名为Enemy的Ta......
  • ant loading效果实现
    1<!DOCTYPEhtml>2<html>3<head>4<metacharset="utf-8">5<title></title>6<styletype="text/css">7.dot{8display:flex......