富文本实现打字效果

正题

涉及到的知识有:正则,富文本,迭代器

不想看废话的请跳最后

Old Code

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

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

大致原理是将文本a通过正则,将匹配到的用""替换掉纯文本b,通过反向遍历b元素,找到在a的位置,将这个位置的前面和后面的字符串(除了自己)拼接起来然后替换成a,将新数据压入栈中,直到遍历完;就会得到一个类似金字塔的效果(除去标签),如下。

只要之后拿到这个栈后不断的pop显示就会得到打字效果。但是我们会发现他是把结果存下来,先把所有结果算出来,此时弊端会出现了;占空间,开始算时会卡一下(如果异步的话那没问题)。但是我想我想要结果的时候再给我算一下,不需要全部算完(这样我中途跑路了,性能也会那么坏)。于是诞生了新的代码

New Code

也写了注释了,用迭代器的方式一次一次给,而且是正向搜索,复杂度比之前的好的多。

(我也好奇为什么他正则要写这种 /<.+?/?>/g 理论上 <.*?> 似乎就可以了)

csharp 复制代码
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;
    }
}
相关推荐
zxc2446039347 分钟前
gpu instancer crowd 动画使用方式
unity
C MIKE2 小时前
unity资源下载
unity
Avalon7122 小时前
Unity中自定义协程的实现
游戏·unity·c#·游戏引擎
jtymyxmz3 小时前
《Unity shader》10.1.5 菲涅尔反射
unity·游戏引擎
老朱佩琪!4 小时前
Unity文字排版错位问题
经验分享·unity·游戏引擎
jtymyxmz4 小时前
《Unity Shader》9.4.3 使用帧调试器查看阴影绘制过程
unity·游戏引擎
jtymyxmz4 小时前
《Unity Shader》10.3.1 在Unity中实现简单的程序纹理
unity·游戏引擎
jtymyxmz4 小时前
《Unity Shader》11.2.1 序列帧动画
unity·游戏引擎
UX201714 小时前
Unity中的Color.HSVToRGB
unity·游戏引擎
TO_ZRG14 小时前
Unity PackageManager
unity·gitlab