精易论坛

标题: 代码实现易语言的分割文本() [打印本页]

作者: APPLEUFO    时间: 2021-11-26 23:29
标题: 代码实现易语言的分割文本()
  
子程序名返回值类型公开备 注
文本模块_分割文本整数型 注意会删除空文本(参数_分割用文本 是空文本的话,是其他字符也会删除调)。 在短的数据里,数据量又大的时候,可能会比默认的分割文本快,喜欢的话 测试一下吧
参数名类 型参考可空数组备 注
参数_原始文本文本型
参数_分割用文本文本型
参数_返回数组文本型
变量名类 型静态数组备 注
局变_找到位置整数型 
局变_标记整数型0如果是空格,就是空格标记位置
n1整数型 
x1整数型 
y1整数型 
局变_文本文本型 
如果真 (取文本长度 (参数_原始文本) = 0)
返回 (0)

局变_找到位置 = 寻找文本 (参数_原始文本, 参数_分割用文本, , )
如果真 (局变_找到位置 = -1)
返回 (0)

清除数组 (参数_返回数组)
加入成员 (局变_标记, 0)  ' 首
加入成员 (局变_标记, 局变_找到位置)
循环判断首 ()
局变_找到位置 = 寻找文本 (参数_原始文本, 参数_分割用文本, 局变_找到位置 + 1, )
如果 (局变_找到位置 = -1)
跳出循环 ()


加入成员 (局变_标记, 局变_找到位置)

循环判断尾 ()
如果真 (局变_标记 [取数组成员数 (局变_标记)]取文本长度 (参数_原始文本))
加入成员 (局变_标记, 取文本长度 (参数_原始文本) + 1)  ' 尾

计次循环首 (取数组成员数 (局变_标记) - 1, n1)
x1 = 局变_标记 [n1] + 1
y1 = 局变_标记 [n1 + 1] - 1
如果真 (x1 > y1)  ' 说明交错了,中间没有东西
到循环尾 ()

局变_文本 = 文本模块_取文本中间_位置 (参数_原始文本, x1, y1)
加入成员 (参数_返回数组, 局变_文本)
计次循环尾 ()
返回 (取数组成员数 (参数_返回数组))

  
子程序名返回值类型公开备 注
文本模块_取文本中间_位置文本型 取出符号位置内的文本(包含符号本身)。参数开始位置:1为首位置,2为第2个位置,如此类推。 注意:需注意,如果是双字符,第二个位置需要加1,才能取得第二个的文本尾部位置.需注意单字符还是双字符
参数名类 型参考可空数组备 注
参数文本文本型
参数开始位置整数型1为首位置,2为第2个位置,如此类推。
参数结束位置整数型
变量名类 型静态数组备 注
局变结果文本文本型 
如果真 (参数开始位置 = -1 参数结束位置 = -1)
' 调试输出 (“模块_取文本中间_根据位置”, 参数文本, 参数开始位置, 参数结束位置)
返回 (“”)

局变结果文本 = 取文本中间 (参数文本, 参数开始位置, 参数结束位置 ��� (参数开始位置 - 1))  ' 开始位置也算一位
返回 (局变结果文本)
' 总觉得  取文本中间()  第三个参数有些变扭 ,欲取出字符的数目
' 若是不知道文本字符数目的话,还得倒过头来算一遍字符数目,绕弯~~、
' 刚好写某软要取引号中的文本,想到了个办法
' 和原来的取文本中间相比,整个的代码简练多了 ,下面是与取文本中间的对比
' 例如  ’你好"旧时光"八月长安     ' 取出引号中的内容
' 模块_取文本中间_根据位置(文本,引号开始位置+1,引号结束位置-1)
' 例程,单个字符与双字符很不一样,需注意
' 局变_文本 = “★☆插件  AddMoonProject.dll 加载成功☆★”
' 局变_位置1 = 寻找文本 (局变_文本, “☆”, , )
' 局变_位置2 = 寻找文本 (局变_文本, “☆”, 局变_位置1 + 1, )
' 文本模块_取文本中间_位置(局变_文本,局变_位置1,局变_位置2)






这是结果
  
子程序名返回值类型公开备 注
_临时子程序  
变量名类 型静态数组备 注
aaaaa文本型 
bbb文本型0
ccc文本型0
aaaaa = “xxx.yyy.zzz”
bbb = 分割文本 (aaaaa, “.”, )
文本模块_分割文本 (aaaaa, “.”, ccc)
调试输出 (bbb)
调试输出 (ccc)
调试输出 (“_____________________________”)
aaaaa = “https://www.bilibili.com/video/BV1RL411M7jK”
bbb = 分割文本 (aaaaa, “/”, )
文本模块_分割文本 (aaaaa, “/”, ccc)
调试输出 (bbb)
调试输出 (ccc)
调试输出 (“_____________________________”)
aaaaa = “xxxYYyyyYzzz”
bbb = 分割文本 (aaaaa, “Y”, )
文本模块_分割文本 (aaaaa, “Y”, ccc)
调试输出 (bbb)
调试输出 (ccc)


i支持库列表   支持库注释   
spec特殊功能支持库


例如
分割文本() 默认结果是 “a”,"","b"
而这个   文本模块_分割文本()  的结果就是 “a”,"b"

易语言默认的分割文本,有时候经常会出现空数组
这个也把空数组给删除了,准确来说是跳过不统计进去

作者: 醉卧美人膝    时间: 2021-11-27 00:25
来看看
作者: guige666    时间: 2021-11-27 00:30
66666666666666666666666
作者: wtflxk    时间: 2021-11-27 09:41
这到也是个方法,发散性思维真心不错
作者: mxdn    时间: 2021-11-27 17:31
kk看看拿金币
作者: 我就我    时间: 2021-11-29 00:54
这么复杂
作者: jzlyx110    时间: 2021-11-29 02:11
看起来好厉害
作者: BIG牛肉面    时间: 2021-11-29 08:59
谢谢分享来看看
作者: 我就我    时间: 2021-12-1 04:55
有点不懂,从源码来看aaaaa不也是数组?
作者: APPLEUFO    时间: 2021-12-4 10:33
我就我 发表于 2021-12-1 04:55
有点不懂,从源码来看aaaaa不也是数组?

  aaa是文本型啊
作者: q312459945    时间: 2021-12-4 19:48
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
作者: 趣冉科技    时间: 2022-1-4 21:55
感谢楼主分享,支持一下~~!!!
作者: 瓶中仙子    时间: 2022-1-24 00:46
比易自带的分割文本的速度怎么样
作者: 瓶中仙子    时间: 2022-1-24 00:56
刚才测试好像很慢啊
作者: APPLEUFO    时间: 2022-1-25 22:11
瓶中仙子 发表于 2022-1-24 00:56
刚才测试好像很慢啊

应该不会慢太多,另外这个会删除空内容的文本,可以减少以后循环删除空文本的步骤,分割后的数据也会比默认的少一些
作者: ghost12    时间: 2022-5-3 04:01
感谢发布原创作品,一定好好学习,天天向上
作者: APPLEUFO    时间: 2022-10-26 01:34
  
子程序名返回值类型公开备 注
文本模块_分割文本3整数型 
参数名类 型参考可空数组备 注
参数_原始文本文本型
参数_分割用文本文本型
参数_结果数组文本型
变量名类 型静态数组备 注
局变_找到位置整数型 
局变_首整数型 
局变_尾整数型 
局变_分隔符位置模块_游标0
局变_游标模块_游标 
n1整数型 
如果真 (取文本长度 (参数_原始文本) = 0)
返回 (0)

局变_找到位置 = 寻找文本 (参数_原始文本, 参数_分割用文本, , )
如果真 (局变_找到位置 = -1)
返回 (0)

清除数组 (参数_结果数组)
循环判断首 ()
局变_首 = 寻找文本 (参数_原始文本, 参数_分割用文本, 局变_尾 + 1, )
如果 (局变_首 = -1)
跳出循环 ()


局变_尾 = 局变_首 + 取文本长度 (参数_分割用文本) - 1
局变_游标.首 = 局变_首
局变_游标.尾 = 局变_尾
加入成员 (局变_分隔符位置, 局变_游标)

循环判断尾 ()
计次循环首 (取数组成员数 (局变_分隔符位置), n1)
如果 (n1 = 1)
加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 1, 局变_分隔符位置 [n1].首 - 1))


加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 局变_分隔符位置 [n1 - 1].尾 + 1, 局变_分隔符位置 [n1].首 - 1))

计次循环尾 ()
加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 局变_分隔符位置 [取数组成员数 (局变_分隔符位置)].尾 + 1, 取文本长度 (参数_原始文本)))  ' 最后一个
返回 (取数组成员数 (参数_结果数组))


.版本 2

.数据类型 模块_游标, 公开, 游标是一个类似"点",有横坐标,纵坐标的数据类型,游标则有首,尾组成,取自丈量长度的游标卡尺
    .成员 首, 整数型
    .成员 尾, 整数型



新的  修复bug


作者: APPLEUFO    时间: 2022-10-28 00:23
.版本 2
.支持库 spec

.子程序 文本模块_分割文本3, 整数型, 公开
.参数 参数_原始文本, 文本型
.参数 参数_分割用文本, 文本型
.参数 参数_结果数组, 文本型, 数组,  
.局部变量 局变_找到位置, 整数型
.局部变量 局变_首, 整数型
.局部变量 局变_尾, 整数型
.局部变量 局变_分隔符位置, 模块_游标, , "0"
.局部变量 局变_游标, 模块_游标
.局部变量 n1, 整数型
.局部变量 局变_结尾, 整数型, , , 用于开始和结束的边界变量

.如果真 (取文本长度 (参数_原始文本) = 0)
    返回 (0)
.如果真结束

局变_找到位置 = 寻找文本 (参数_原始文本, 参数_分割用文本, , 假)
.如果真 (局变_找到位置 = -1)
    返回 (0)
.如果真结束

清除数组 (参数_结果数组)

.循环判断首 ()

    局变_首 = 寻找文本 (参数_原始文本, 参数_分割用文本, 局变_尾 + 1, 假)
    .如果 (局变_首 = -1)
        跳出循环 ()
    .否则

        局变_尾 = 局变_首 + 取文本长度 (参数_分割用文本) - 1

        局变_游标.首 = 局变_首
        局变_游标.尾 = 局变_尾
        加入成员 (局变_分隔符位置, 局变_游标)
    .如果结束

.循环判断尾 (真)


.计次循环首 (取数组成员数 (局变_分隔符位置), n1)
    .如果 (n1 = 1)

        .如果 (局变_分隔符位置 [n1].首 - 1 = 0)  ' 开始的边界
            ' 不用添加一个空文本了
        .否则

            加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 1, 局变_分隔符位置 [n1].首 - 1))
        .如果结束


    .否则

        加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 局变_分隔符位置 [n1 - 1].尾 + 1, 局变_分隔符位置 [n1].首 - 1))
    .如果结束


.计次循环尾 ()

局变_结尾 = 局变_分隔符位置 [取数组成员数 (局变_分隔符位置)].尾 + 1  ' 这里是结尾

.如果 (局变_结尾 ≥ 取文本长度 (参数_原始文本))
    ' 无动作   不用添加了///   = 是一样长,大于是一样长且超过末尾文本长度了
.否则

    加入成员 (参数_结果数组, 文本模块_取文本中间_位置 (参数_原始文本, 局变_结尾, 取文本长度 (参数_原始文本)))  ' 最后一个'  这里待会看看
.如果结束


调试输出 (局变_分隔符位置 [取数组成员数 (局变_分隔符位置)].尾 + 1, , 取文本长度 (参数_原始文本))

返回 (取数组成员数 (参数_结果数组))


新的,不快能用就是了




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4