(已解决) 关于函数 sbs 与文本切片
大佬们,下午好🙏 关于 spl 中的文本切片,我有几个问题恳请大佬们帮助指导。
spl 中有文本切片的函数,像 mid,left,right 均能切片,还有一个 s.sbs(a:b,…),取出字符串 s 中的多个子串组成新的字符串,其中参数 a:b 表示索引位置,可以写成以下几种形式:
1、a:b,最正常的写法,表示从位置 a 取到位置 b;
2、a: ,省略 b,表示从位置 a 取到最后 len(s);
3、 :b,省略 a,表示从开头位置 1 取到位置 b;
4、只写一个位置,比如 a,表示取位置 a 处的值;
5、只写一个冒号,表示取全部。
运用之后发现,sbs 在文本切片时会有以下限制:
1、位置 a 和 b 必须在字符串长度范围内,1<=a,b<=len(s),如果位置小于 1 或者大于 len(s) 就会抛出错误;
2、因为位置参数必须是正整数,自然就限制了负整数的使用。
但负整数可以表示从右往左倒着数,这一点在 spl 语法中是存在的,像函数 mid,left,right 里就可以使用负整数,还有序列切片时也能引用负整数,A.m(-1:-2)。
在其他编程语言中也有利用位置索引进行切片的语法,比如在 Python 语法里可以这样使用文本切片:string[start : end : step]
1、有三个参数,起始位置: 结束位置: 步长
2、索引位置支持负整数
3、有个步长参数,用于间隔取数,支持负整数步长
In my humble opinion,Python 中的切片语法倒是蛮不错的,所以,我就琢磨,spl 的 sbs 是否也能这样切片,my two cents as below:
1、s.sbs()能否实现支持负整数?不知道对排号键 k.sbs() 会不会有影响。若能支持负整数切片,会方便很多;
2、切片时索引越界能否不抛出错误?越界了就按正常字符串长度处理。
3、能否增加步长?比如,s.sbs(start : end : step),甚至是序列切片时的步长,序列.m(start : end : step)。若增加了步长,可以更简洁地实现间隔取值。除了 Python,像微软的 Power Query 也有专门的间隔取值函数 List.Alternate,Table.AlternateRows,虽然 spl 有 step 函数,但总归要去多转一步。序列间隔取值时还好,那文本间隔取值时转换就会比较多了,先 split 成序列,再用 step,取值后再 concat,会很繁琐。若能一步到位,使用就会很方便。
以上这些只是我不成熟的想法,我能想到的东西,大佬们肯定早就想到了。这个不是能不能实现的问题,是值不值得实现的问题,恳请大佬们得闲时考虑一下,谢谢!
位置小于 0 或者大于字符串长度会抛异常这个问题改了,只有等于 0 的时候会抛异常。
负数表示从后数也改成支持了。
这两个修改已经提交到开源代码了。
握艹,这太神速了,谢谢 leavdy 大佬,谢谢老贼🙏
等更新😄
程序已更新,请前往下载贴中下载最新的 esproc-bin.jar 文件。
谢谢 leavedy 大佬🙏 谢谢 ddszm 大佬🙏 666👍 👍 👍
帖子中最后的第 3 点,关于步长,恳请大佬们再研究一下😄
虽然 str.split().step().concat() 能实现间隔取值,还是削微有点麻烦,需要三步。
str.sbs(起: 止: 步长,…) 这样是最符合我想法的😄 (哈哈,又想多了🙏)