正则表达式语法

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

本文概述了 Kusto 查询语言 (KQL) 支持的正则表达式语法。

有许多 KQL 运算符和函数通过正则表达式(如 matches regexparsereplace_regex())执行字符串匹配、选择和提取。

在 KQL 中,正则表达式必须编码为字符串文本并遵循字符串引用规则。 例如,正则表达式 \A 在 KQL 中表示为 "\\A"。 额外的反斜杠指示另一个反斜杠是正则表达式 \A 的一部分。

语法

以下部分文档了 Kusto 支持的正则表达式。

匹配一个字符

模式 说明
. 除换行符之外的任意字符(包括带有 s 标志的换行符)
[0-9] 任何 ASCII 数字
\d 数字(\p{Nd}
\D 不是数字
\pX 由单字母名称标识的 Unicode 字符类
\p{Greek} Unicode 字符类(常规类别或脚本)
\PX 由单字母名称标识的求反 Unicode 字符类
\P{Greek} 否定的 Unicode 字符类(一般类别或脚本)

字符类

模式 说明
[xyz] 与 x、y 或 z(并集)匹配的字符类。
[^xyz] 与除 x、y 和 z 之外的任何字符匹配的字符类。
[a-z] 与 a-z 范围内的任意字符匹配的字符类。
[[:alpha:]] ASCII 字符类 ([A-Za-z])
[[:^alpha:]] 非 ASCII 字符类 ([^A-Za-z])
[x[^xyz]] 嵌套/分组字符类(与 y 和 z 以外的任何字符匹配)
[a-y&&xyz] 交集(与 x 或 y 匹配)
[0-9&&[^4]] 使用交集和求反的减法(匹配 0-9,4 除外)
[0-9--4] 直接减法(匹配 0-9,4 除外)
[a-g~~b-h] 对称差集(仅匹配 ah
[\[\]] 在字符类中转义(匹配 [ 或 ])
[a&&b] 空字符类不匹配任何内容

注意

任何命名的字符类都可以出现在带括号的 [...] 字符类内。 例如,[\p{Greek}[:digit:]] 匹配 Greek 脚本中的任何 ASCII 数字或任何代码点。 [\p{Greek}&&\pL] 与希腊字母匹配。

字符类的优先级从最具约束力到最不具约束力:

  1. 范围:[a-cd] == [[a-c]d]
  2. 并集:[ab&&bc] == [[ab]&&[bc]]
  3. 交叉、差异、对称差异:均具有相同的优先级,并从左到右进行评估。 例如,[\pL--\p{Greek}&&\p{Uppercase}] == [[\pL--\p{Greek}]&&\p{Uppercase}]
  4. 求反:[^a-z&&b] == [^[a-z&&b]]

复合物

模式 说明
xy 级联(x其次是y
x\|y 交替(xy ,宁可x

重复匹配

模式 说明
x* 零个或多个 x(贪婪)
x+ 一个或多个 x (贪婪)
x? 零个或一个 x(贪婪)
x*? 零个或多个 x (不贪婪/懒惰)
x+? 一个或多个 x (不贪婪/懒惰)
x?? 零个或一个 x (不贪婪/懒惰)
x{n,m} 至少 n x 且至多 m x(贪婪)
x{n,} 至少 n x (贪婪)
x{n} 正好 n x
x{n,m}? 至少 n x 且最多 m x (不贪婪/懒惰)
x{n,}? 至少 n x (不贪婪/懒惰)
x{n}? 正好 n x

空匹配

模式 说明
^ 草垛的开始(或多行模式的开始)
$ 草垛的尽头(或多行模式的行尾)
\A 只是草垛的开始(平衡启用了多行模式)
\z 只是大海捞针的尽头(平衡启用了多行模式)
\b Unicode 字边界(\w在一方面和\W\A,或 \z在另一方面)
\B 不是 Unicode 字边界
\b{start}, \< Unicode 字开始边界(\W\|\A在左边,\w在右边)
\b{end}, \> Unicode 字尽头边界(\w在左边,\W\|\z在右边)
\b{start-half} Unicode 字开始边界的一半(\W\|\A在左边)
\b{end-half} Unicode 字尽头边界的一半(\W\|\z在右边)

分组和标志

模式 说明
(exp) 编号捕获组(通过左括号索引)
(?P<name>exp) 命名(也编号)捕获组(名称必须是字母数字)
(?<name>exp) 命名(也编号)捕获组(名称必须是字母数字)
(?:exp) 非捕获组
(?flags) 在当前组内设置标志
(?flags:exp) 给exp设置标志(非捕获)

捕获组名称只能包含Alpha数值 Unicode 代码点,点.,下划线_,和方括号[]。 名称必须以 _ 或字母代码点开头。 字母代码点对应于 Alphabetic Unicode 属性,而数字代码点对应于 Decimal_NumberLetter_NumberOther_Number 常规类别的并集。

标志是单个字符。 例如,(?x) 可设置标志 x(?-x) 可清除标志 x。 可以同时设置或清除多个标志:(?xy) 可设置 xy 标志,(?x-y) 可设置 x 标志并清除 y 标志。 默认情况下,所有标志都是禁用的,除非另有说明。 它们是:

标记 说明
i 不区分大小写:字母匹配大写和小写
m 多行模式:^$匹配匹配行首/行末
s 允许点 (.)。 匹配 \n
R 启用 CRLF 模式:当启用多行模式时,已使用\r\n
U 交换含义x*x*?
u Unicode 支持(默认启用)
x 详细模式,忽略空格并允许行注释(以#开始)

请注意,在详细模式下,任何地方(包括字符类内)的空格都会被忽略。 若要插入空格,请使用其转义形式或十六进制文字。 例如,\ \x20 表示 ASCII 空格。

注意

  • 可以在模式内切换标志。 例如,以下语法对第一部分使用不区分大小写的匹配,对第二部分使用区分大小写的匹配:(?i)a+(?-i)b+
  • a+匹配任何一个aA,但b+只匹配b
  • 多线模式含义着 ^$不再仅仅匹配输入的开头或结尾,还匹配行的开头或结尾。 请注意,^ 在新行之后匹配,即使在输入末尾也是如此。
  • 当 CRLF 模式和多行模式都启用时,然后 ^$匹配任一\r\n,但并不在\r\n中间。
  • Unicode 模式也可以选择性地禁用,尽管只有当结果与无效的 UTF-8 不匹配时才可以禁用。 例如,使用 ASCII 字边界而不是 Unicode 字边界可能会使某些正则表达式搜索运行得更快:(?-u:\b).+(?-u:\b) 匹配$$abc$$

转义序列

模式 说明
\* 字面*,适用于所有 ASCII除[0-9A-Za-z<>]
\a 铃(\x07
\f 形式馈送(\x0C
\t 水平制表符
\n 换行
\r 回车
\v 垂直标签(\x0B
\A 匹配一个草垛的开始
\z 在草垛的尽头匹配
\b 字边界断言
\B 否定词边界断言
\b{start}, \< 字开始边界断言
\b{end}, \> 字尽头边界断言
\b{start-half} 字开始边界断言的一半
\b{end-half} 字尽头边界断言的一半
\123 八进制字符代码,最多三位数字
\x7F 十六进制字符代码(正好两位数字)
\x{10FFFF} 对应于 Unicode 代码点的十六进制字符代码
\u007F 十六进制字符代码(正好四位数字)
\u{7F} 对应于 Unicode 代码点的十六进制字符代码
\U0000007F 十六进制字符代码(正好八位数字)
\U{7F} 对应于 Unicode 代码点的十六进制字符代码
\p{Letter} Unicode 字符类
\P{Letter} 否定的 Unicode 字符类
\d, \s, \w 匹配 Perl 字符类
\D, \S, \W 否定的 Perl 字符类

Perl 字符类 (Unicode 友好)

这些类基于 UTS#18 中提供的定义:

模式 说明
\d D数字(\p{Nd}
\D 不是数字
\s 空格(\p{White_Space}
\S 非空格
\w 单词字符(\p{Alphabetic} + \p{M} + \d + \p{Pc} + \p{Join_Control}
\W 非单词字符

ASCII 字符类

这些类基于 UTS#18 中提供的定义:

模式 说明
[[:alnum:]] 字母数字([0-9A-Za-z]
[[:alpha:]] 按字母顺序([A-Za-z]
[[:ascii:]] ASCII ([\x00-\x7F])
[[:blank:]] 空白([\t ]
[[:cntrl:]] 控制([\x00-\x1F\x7F]
[[:digit:]] 数字([0-9]
[[:graph:]] 图形([!-~]
[[:lower:]] 小写([a-z]
[[:print:]] 可打印([ -~]
[[:punct:]] 标点([!-/:-@\[-`{-~]
[[:space:]] 空格([\t\n\v\f\r ]
[[:upper:]] 大写([A-Z]
[[:word:]] 单词字符([0-9A-Za-z_]
[[:xdigit:]] 十六进制数字([0-9A-Fa-f]

性能

本分区提供了有关正则表达式的速度和资源使用的一些指导。

Unicode 可能会影响内存使用和搜索速度

KQL 正则表达式为 Unicode 提供第一类的支持。 在许多情况下,支持 Unicode 必需的额外内存可以忽略不计,通常不会影响搜索速度。

以下是一些可能影响内存使用量和搜索速度的 Unicode 字符类的示例:

  • 内存使用情况:Unicode 的影响主要源于 Unicode 字符类的使用。 Unicode 字符类的尺寸往往较大。 例如,\w字符类默认匹配大约 140,000 个不同的代码点。 这需要额外的内存并且会减慢正则表达式的编译速度。 如果您的要求可以通过 ASCII 满足,建议使用 ASCII 类而不是 Unicode 类。 \w的ASCII 版本可以用多种方式表示,所有方式都是等效的。

    [0-9A-Za-z_]
    (?-u:\w)
    [[:word:]]
    [\w&&\p{ascii}]
    
  • 搜索速度:即使使用大型 Unicode 字符类,Unicode 也往往能得到很好的处理。 但是,一些更快的内部正则表达式引擎无法处理 Unicode 感知字边界断言。 因此,如果你不需要 Unicode 感知的字边界断言,你可以考虑使用(?-u:\b) 而不是\b(?-u:\b) 使用 ASCII 唯一的单词字符定义,这可以提高搜索速度。

文字可以加速搜索

KQL 正则表达式具有强大的识别正则表达式模式中的文字的能力,这可以显著加快搜索速度。 如果可能的话,在模式中包含文字可以大大提高搜索性能。 例如,在正则表达式中 \w+@\w+@的第一发生次数匹配,然后给\w+进行反向匹配找到起始位置。