你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

正则表达式语法

适用于:✅Microsoft Fabric✅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 匹配的字符类(union)。
[^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) 命名(也编号)捕获组(名称必须为 alpha-numeric)
(?<name>exp) 命名(也编号)捕获组(名称必须为 alpha-numeric)
(?:exp) 非捕获组
(?flags) 在当前组中设置标志
(?flags:exp) 为 exp 设置标志(非捕获)

捕获组名称只能包含字母数字 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 Word 边界断言
\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 Negated Perl 字符类

Perl 字符类 (Unicode 友好)

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

模式 说明
\d Ddigit (\p{Nd}
\D 非数字
\s 空格 (\p{White_Space}
\S 非空格
\w Word 字符 (\p{Alphabetic}\p{Join_Control} + + + \p{Pc} + \p{M}\d
\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 类。 仅 ASCII 版本的 \w 可采用多种方式表示,所有这些版本都是等效的。

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

文本可以加速搜索

KQL 正则表达式具有很强的识别正则表达式模式中的文本的能力,这可以显著加快搜索速度。 如果可能,在模式中包含文本可以极大地提高搜索性能。 例如,在正则表达式 \w+@\w+中,首先 @ 匹配匹配项,然后执行反向匹配以 \w+ 查找起始位置。