(已解决)substr 函数与第 n 个分隔符前 (后) 的字符串

有一个用符号 "-“分隔的字符串,想返回第 n 个分隔符”-" 之前 (后) 的字符串,如下:

应收股利-应收理财产品红利-可供出售金融资产-信托-场外-XX信托-XX信托计划

这是一个会计科目,用分隔符隔开从左到右描述的是层级关系,类似这样的还有描述行政区划关系的,比如:

XX省-XX市-XX区-XX街道-XX居委会

目前,集算器用于返回某个字符串前后的字符串最直接的函数是 substr:

=substr(字符串,分隔符)      返回分隔符右侧的字符串

=substr@l(字符串,分隔符)    返回分隔符左侧的字符串

但 substr 只能返回第一个分隔符前后的字符串。

如果要获取第 n 个分隔符前 (后) 的字符串,需要另寻他法:

1、用 split 按分隔符拆分成序列,然后用序列方法获取位置 n 前后的序列,再合并成文本。

=字符串.split(分隔符).m(:n).concat(分隔符)       返回第n个分隔符之前的字符串

=字符串.split(分隔符).m(n+1:).concat(分隔符)     返回第n个分隔符之后的字符串

2、写正则表达式,比如:

以下捕获的是第3个分隔符"-"之前的字符串,此时正则表达式中的量词要写成n-1:

=字符串.regex($[^((?:[^-]*-){2}[^-]*)(?=-|$)])

以下捕获的是第3个分隔符"-"之后的字符串,此时量词正常写:

=?.regex($[^(?:[^-]*-){3}(.*)$])

以上两种方法都可以用但不够直接。

市面上也有直接支持获取第 n 个分隔符前后字符串的方法,比如,

1、数据库 MySQL 有操作文本的函数 SUBSTRING_INDEX(s, delimiter, number)

返回从字符串 s 的第 number 个出现的 delimiter 之后的子串。如果 number 是正数,返回第 number 个字符左边的字符串。如果 number 是负数,返回第 (number 的绝对值(从右边数)) 个字符右边的字符串。

2、EXCEL/WPS 的 TEXTBEFORE 和 TEXTAFTER 函数也支持第 n 个分隔符。

imagepng

3、Power Query 有 Text.BeforeDelimiter、Text.AfterDelimiter、Text.BetweenDelimiters 也支持第 n 个分隔符。

具体到实战,除了经常碰到的会计科目层级,昨天还碰到一个按层级拼接行政区划的,如下:

imagepng

需要根据 B 列所示的层级号,把 A 列中的值拼接成 C 列所示的样子,按层级顺序显示。

要解决这个问题,集算器有简洁高效的写法,也用不上拆分子串,如下,维护一个全局变量序列 A 用于描述层级,然后根据层级号赋值切片就行。

imagepng

或者用 iterate@a 始终对生成的上一个结果进行操作:

imagepng

可以看到,在 iterate 的过程中操作的也是序列,完事后再循环用 concat。如果此时 iterate 操作的对象是文本,且能支持第 n 个分隔符的获取,那 iterate 就能直接出结果了,以下是伪代码:

=spl("=?.iterate@a(substr(~~,$[-],~2-1)/$[-]/~1)",A2:B85)

所以,我想着咱集算器函数 substr 可不可以支持一下这个参数功能😄 比如:

=substr(s,d,n)    返回第n个d之后的字符串

=substr@l(s,d,n)  返回第n个d之前的字符串

n支持整数,负数表示倒着数,没有字符串可返回时默认为空。

恳请大佬们得闲时看看,万分感谢🙏 😄