提问人:sevenmiracle 提问时间:5/4/2023 最后编辑:Jonathon McMurraysevenmiracle 更新时间:5/7/2023 访问量:151
kdb:如何匹配复杂字符串
kdb: how to match complex strings
问:
我有一张这样的桌子
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官网发现了这个错误,但是没有办法解决这个问题,我该怎么办? 提前致谢。
答:
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 接口引入外部库
- https://code.kx.com/q/basics/regex/#regex-libraries
- https://code.kx.com/developer/libraries/regular-expression-pcre2/
- https://github.com/KxSystems/ffi/blob/master/examples/pcre.q
或者 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
非常感谢 - 现在更清楚了:-)
评论