Text.Before/After/BetweenDelimiter(s)

官方说明:

返回text中指定的startDelimiter和endDelimiter之间的部分。可选数字startIndex指示要考虑哪一次出现的startDelimiter。可选列表startIndex指示要考虑哪一次出现的startDelimiter,以及应从输入的开头还是结尾编制索引。endIndex类似,不同之处在于,相对于startDelimiter编制。
Text.BetweenDelimiters(text as nullable text,startDelimiter as text,endDelimiter as text,optional startIndex as any,optional endIndex as any)as any
 

解读:

这三个函数,是2017年4月新增的,所以如在较老的版本中使用会报错。顾名思义,Delimiter表示分隔符,Before/Between/After分别表示从分隔符之前/之间/之后提取文本。三个函数的参数和语法差不多,所以我放在一起并且上面只放了Text.BetweenDelimiters这一个的说明,注意最后的s,其他两个没有。

例1:Before和After

a="111-222-333",
b=Text.BeforeDelimiter(a,"-"),                               //不指定索引,默认索引为0,即提取第1个,结果为"111"
c=Text.BeforeDelimiter(a,"-",1),                             //索引为1,即提取第2个分隔符之前的部分,结果为"111-222"
d=Text.BeforeDelimiter(a,"-",{1,1}),                         //索引为{1,1},第一个1表示索引,第二个1表示顺序,0代表正数,1代表倒数,即倒数第2个,结果为"111"
e=Text.BeforeDelimiter(a,"-",99),                            //索引为5,但是一共只有2个分隔符,超出范围了所以返回全部,结果为"111-222-333"
f=Text.AfterDelimiter(a,"-",{1,1})                           //after和before指定分隔符的位置一样,只不过返回分隔符之后的部分,结果为"222-333"

 

例2:Between

a="ABC<DE>FG<HIJ>KLM<NO>PQ<R>ST<U>VW<X>YZ",
b=Text.BetweenDelimiters(a,"<",">"),                         //不指定索引,默认索引为0,默认提取第1个,结果为"DE"
c=Text.BetweenDelimiters(a,"<",">",1),                       //只指定开始的索引,默认结束索引为0,但结束索引是相对开始分隔符的位置,从第2个"<"即G后开始数第1个">",所以应该是J后的而不是E后的,结果为"HIJ"
d=Text.BetweenDelimiters(a,"<",">",1,1),                     //开始和结束索引都为1,结果为"HIJ>KLM<NO"
e=Text.BetweenDelimiters(a,"<",">",{3,1},1),                 //{3,1}表示开始分隔符为倒数第4个"<",在M后,再向后数第2个">"在R后,结果为"NO>PQ<R"
f=Text.BetweenDelimiters(a,"<",">",{3,1},{1,1})              //倒数第4个"<"在M后,再倒数第2个">"在E后,结果为"FG<HIJ>KLM"
g=Text.BetweenDelimiters(a,"<",">",{3,1},{99,1})             //倒数第4个"<"在M后,再倒数第100个">"已经超出范围,所以返回开始分隔符之前的所有部分,结果为"ABC<DE>FG<HIJ>KLM"

有意思的是,当最后一个参数为{n,1}即倒数第n个时,结束分隔符反而跑到了开始分隔符之前,开始变成了结束,结束变成了开始。但只要记住,先找开始分隔符,再根据开始的相对位置找结束分隔符,结果即为两者之间的部分,千万不要被绕晕了。
 

例3:批量提取

如果我们需要提取出所有"<"和">"之间的内容,那么可以配合List.Transform使用,得到所有分隔符之间内容组成的list:

a="ABC<DE>FG<HIJ>KLM<NO>PQ<R>ST<U>VW<X>YZ",
b=List.Transform({0..5},each Text.BetweenDelimiters(a,"<",">",_))

 
相比于Text.SplitText.SplitAny拆分再提取的方式,该函数的优势在于分隔符可以是多字符的文本,而split只能是单字符。
在涉及到文本提取时,这三个函数为不二之选,堪称"文本提取三剑客"。

8 Replies to “Text.Before/After/BetweenDelimiter(s)”

  1. e=Text.BeforeDelimiter(a,"-",99),
    //索引为5,但是一共只有2个分隔符,超出范围了所以返回全部,结果为"111-222-333"

    这里的索引为5, 是不是应该修改为99, 或者把上面的99修改为5.

    1. 可能要看字符串本身的规律了,比如是否提取段是英文开头和结尾,或者是汉字和括号中间,有没有位数固定规则等等,确定规则后应该很好处理

  2. a="ABCFGKLMPQSTVWYZ",
    b=List.Transform({0..5},each Text.BetweenDelimiters(a,"",_))
    第二个为是HIJ,看上去象HU,怎么想也想不通,哈哈~

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注