KDB中使用cut分割字符串列表未达预期,求提取指定子串的方法
解决KDB中截取第一个@之后字符串的问题
我来帮你搞定这个字符串处理的需求~你想要从每个字符串里去掉第一个@及其前面的内容,保留后面的部分,之前用cut没得到预期结果,是因为cut的作用是按索引拆分字符串,而不是截取从某个位置到末尾的内容。下面给你两种简洁的实现方式:
方法1:通过索引截取
先找到每个字符串中第一个@的位置,然后从该位置的下一个索引开始截取到字符串末尾:
q)a:("ua@1100@1";"sba@2220@2";"r@4444@a") q){x[1+first x?:"@";]} each a ("1100@1";"2220@2";"4444@a")
原理说明:
x?:"@":获取当前字符串中所有@的索引位置first:取出第一个@的索引1+:得到第一个@的下一个位置(也就是我们要保留内容的起始点)x[start;]:从起始点start开始截取字符串到末尾
方法2:正则表达式替换
利用KDB的ssr(字符串替换)函数,直接把开头到第一个@的内容替换为空:
q)ssr[;"^.*?@";""] each a ("1100@1";"2220@2";"4444@a")
原理说明:
^.*?@是正则表达式:^:匹配字符串开头.*?:非贪婪匹配任意字符(确保只匹配到第一个@为止)@:匹配@本身
- 把这段匹配到的内容替换为空字符串,就直接得到了我们想要的结果
为什么之前的cut不符合预期?
cut函数的作用是按给定的索引列表拆分字符串,比如你用单个索引2去拆分"ua@1100@1",会得到("ua";"@1100@1"),但你需要的是去掉@本身,所以直接用cut无法一步到位,反而会因为索引处理不当得到碎片化的结果。
内容的提问来源于stack exchange,提问作者user9582902
相关产品推荐
相关产品推荐

