Azure 数据资源管理器,Kusto:extract() 中的正则表达式在语义上不正确

Azure Data Explorer, Kusto: regex not semantically correct in extract()

我正在尝试获取 Kusto 中列值的子字符串。

我知道字符串总是以格式 'text-for-fun-' 开头,然后是我想要的字母串,然后是任何非字母的内容。

我想我应该使用 extract(),因为它允许我输入一个正则表达式来处理可以跟在我想要的字符串后面的字符的多种可能性。

但是,当我尝试输入正则表达式时,我一直收到 SEM0420: Semantic error: Regex pattern is ill formed

你能帮我弄清楚如何正确输入正则表达式吗?

示例字符串:stuff milk-cow-cocoa a/123

所需的子字符串:cocoa

当前正则表达式:(?<=milk-cow-\s*).*?(?=\s*[^A-Za-z])

注意:看起来单个星号已被删除。它们出现在下面的代码中。

此时,\s 将防御性地解析字符串并删除空格。整个字符串的末尾也可能紧跟在所需的子字符串之后。

我尝试过类似于此 Data Explorer 语句的方法:

cluster("mine").database("mine").
DataTable
| where PreciseTimeStamp >ago(5h) and resourceProvider == "Provider" 
| where info has "cow-milk-"
| take 200
| project extract("(?<=milk-cow-\s*).*?(?=\s*[^A-Za-z])", 0, info), info 

我必须在每个 \ 之前添加一个额外的 \ 以便数据资源管理器正确解析字符串。

您的正则表达式引擎在回顾时阻塞,也可能在展望时阻塞。

你有第二个参数给 extract 告诉函数只 return 捕获,所以你可以使用

| project extract("milk-cow-\s*([a-zA-Z]+)", 1, info)

意思是

  • milk-cow- - 匹配 milk-cow-
  • \s* - 匹配 0 个或多个空格
  • ([a-zA-Z]+) - 只匹配一个或多个 ASCII 字母并将其捕获到组 1 中。