我用这个正则表达式在Kusto列中查找SHA1:
b[a-fA-F0-9]{40}b
然而,我得到了很多非十六进制数字(只有1-9位数字(的匹配。如何确保匹配至少包含一个十六进制数字(a-f(?
Kusto不支持查找:Kusto是否不支持regex查找?
也许你可以在单词边界之间匹配40位数字来解决这个问题,并使用带有捕获组([a-fA-F0-9]{40})
的交替|
来捕获extract_all允许的内容
b[0-9]{40}b|b([a-fA-F0-9]{40})b
查看带有捕获组值的regex演示。
基于extract_all((的解决方案,然后在结果上匹配regex。
提取所有40个长度的十六进制字符串,并检查结果是否包含集合[a-fA-F]
的字符
datatable(text:string)
[
"SHA1: 273d3fd2f0cf934569319b10e85a9dfadcff113c 6791012659213568246582140340987435098743 e59c299bc9b181240c546464a93ac2d4d001ce02"
,"Only digits: 6791012659213568246582140340987435098743"
,"Too short: f0cf934569319b10e85a9d"
,"Too long: 273d3fd2f0cf934569319b10e85a9dfadcff113c123"
,"888ead874a7c562ef1642e83cca05f2f920a2399"
]
| where extract_all(@"b([[:xdigit:]]{40})b", text) matches regex "[a-fA-F]"
text |
---|
SHA1:273d3fd2f0cf9345669319b10e85a9dfadcff113c 679101265921356824658214034098743508743 e59c299bc9b181240c5464664a93ac2d4d001ce02 |
888头874a7c562ef1642e83cca05f2f920a2399 |
使用extract_all((,&array_length((检查十六进制字符串的数量与十进制字符串的数量。
请注意,使用此方法,我们实际上不需要提取任何内容,只需要提取空字符串。
datatable(text:string)
[
"SHA1: 273d3fd2f0cf934569319b10e85a9dfadcff113c 6791012659213568246582140340987435098743 e59c299bc9b181240c546464a93ac2d4d001ce02"
,"Only digits: 6791012659213568246582140340987435098743"
,"Too short: f0cf934569319b10e85a9d"
,"Too long: 273d3fd2f0cf934569319b10e85a9dfadcff113c123"
,"888ead874a7c562ef1642e83cca05f2f920a2399"
]
| where array_length(extract_all(@"b[[:xdigit:]]{40}b()", text)) > coalesce(array_length(extract_all(@"bd{40}b()", text)), 0)
text |
---|
SHA1:273d3fd2f0cf9345669319b10e85a9dfadcff113c 679101265921356824658214034098743508743 e59c299bc9b181240c5464664a93ac2d4d001ce02 |
888头874a7c562ef1642e83cca05f2f920a2399 |
我提高了查询的效率,并能够在稍后的Kusto查询中解析,而不是更改正则表达式。我不会把它标记为一个答案,因为最初的问题是如何从regex本身实现这一点,如果有这个答案会很有趣。
这就是我所做的:
...
| where Content matches regex @'b[a-fA-F0-9]{40}b'
| extend match = extract_all(@'(b[a-fA-F0-9]{40}b)', Content)
| mv-expand match
| where not (match matches regex @'b[0-9]{40}b')
...
在最后一行中,我删除了所有十进制数字的匹配项