kdb:如何匹配复杂字符串

kdb: how to match complex strings

提问人:sevenmiracle 提问时间:5/4/2023 最后编辑:Jonathon McMurraysevenmiracle 更新时间:5/7/2023 访问量:151

问:

我有一张这样的桌子

t:([] c1:til 5;c2:("abcde";"cdefg";"ecbda";"bsdee";"dbzeya"))
c1 c2      
-----------
0  "abcde" 
1  "cdefg" 
2  "ecbda" 
3  "bsdee" 
4  "dbzeya"

我想选择包含 c2 中字符串的行,我是这样做的:"*b*d*"

pattern:"*b*d*"
select from t where c2 like pattern

但报告了错误。

nyi: Not yet implemented

我从KX官网KX官网发现了这个错误,但是没有办法解决这个问题,我该怎么办? 提前致谢。

正则表达式 匹配 KDB

评论


答:

1赞 rianoc 5/4/2023 #1

交叉发布答案来自:

https://community.kx.com/t5/kdb-and-q/Why-regular-expression-doesn-t-work-with-bracket/m-p/13492

kdb+ 没有实现完整的正则表达式。

https://code.kx.com/q/basics/regex/

它支持? * [] ^

如果你想要完全支持,你可以使用 C 接口引入外部库

或者 Python:

0赞 Maurice Lim 5/4/2023 #2

您可以尝试类似的东西:

select from t where{0<last deltas(first where x="b";last where x="d")}each c2

评论

1赞 sevenmiracle 5/4/2023
我是用外部库做的。pattern:".*b.*d.*" select from t where .pcre2.test[pattern;c2;::]
2赞 terrylynch 5/4/2023 #3

状态机可以在原始 q 中工作(尽管它们不是最有效的):

q)m:({0};{1+x="b"};{2+x="d"};{3});
q)select from t where 3=1 m/'c2
c1 c2
----------
0  "abcde"
2  "ecbda"
3  "bsdee"

编辑:添加状态引擎的解释:

它定义了一组状态(由 lambas 表示),其中目标是达到最终状态,在本例中为状态 3。满足此特定正则表达式的字符串应最终处于状态 3。逻辑逐步执行字符串中的每个字符,并针对从 lambda 1 开始的相关 lambda 对其进行测试,即 .然后,每个 lambda 都是一个测试,用于确定字符串是否移动到下一个状态,即 如果下一个字符不是“B”,则将保持状态 1,但如果 .等等1 m/"abcde"{1+x="b"}x="b"

评论

0赞 nikeros 5/6/2023
这很有趣,你能解释一下它是如何工作的吗?
1赞 terrylynch 5/7/2023
是的,请参阅上面的编辑
0赞 nikeros 5/8/2023
非常感谢 - 现在更清楚了:-)