官方说明:
返回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.Split
或Text.SplitAny
拆分再提取的方式,该函数的优势在于分隔符可以是多字符的文本,而split只能是单字符。
在涉及到文本提取时,这三个函数为不二之选,堪称"文本提取三剑客"。
e=Text.BeforeDelimiter(a,"-",99),
//索引为5,但是一共只有2个分隔符,超出范围了所以返回全部,结果为"111-222-333"
这里的索引为5, 是不是应该修改为99, 或者把上面的99修改为5.
我感觉是作者口误,一看能看明白就好了
1645以色列D4918208P-06(180813空运)
1645以色列D4918208P-06(180813空运)
请问如何只提取D4918208P-06
可能要看字符串本身的规律了,比如是否提取段是英文开头和结尾,或者是汉字和括号中间,有没有位数固定规则等等,确定规则后应该很好处理
a="ABCFGKLMPQSTVWYZ",
b=List.Transform({0..5},each Text.BetweenDelimiters(a,"",_))
第二个为是HIJ,看上去象HU,怎么想也想不通,哈哈~
可能版本的关系,刚试了下Text.Split,分隔符可以是多字符。
不可能