正则表达式语法
本文概述了 Kusto 查询语言 (KQL) 支持的正则表达式语法。
有许多 KQL 运算符和函数通过正则表达式(如 matches regex
、parse
和 replace_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] |
对称差集(仅匹配 a 和 h ) |
[\[\]] |
在字符类中转义(匹配 [ 或 ]) |
[a&&b] |
空字符类不匹配任何内容 |
注意
任何命名的字符类都可以出现在带括号的 [...]
字符类内。 例如,[\p{Greek}[:digit:]]
匹配 Greek
脚本中的任何 ASCII 数字或任何代码点。 [\p{Greek}&&\pL]
与希腊字母匹配。
字符类的优先级从最具约束力到最不具约束力:
- 范围:
[a-cd]
==[[a-c]d]
- 并集:
[ab&&bc]
==[[ab]&&[bc]]
- 交叉、差异、对称差异:均具有相同的优先级,并从左到右进行评估。 例如,
[\pL--\p{Greek}&&\p{Uppercase}]
==[[\pL--\p{Greek}]&&\p{Uppercase}]
。 - 求反:
[^a-z&&b]
==[^[a-z&&b]]
。
复合物
模式 | 说明 |
---|---|
xy |
级联(x 其次是y ) |
x\|y |
交替(x 或y ,宁可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_Number
、Letter_Number
和 Other_Number
常规类别的并集。
标志是单个字符。 例如,(?x)
可设置标志 x
,(?-x)
可清除标志 x
。 可以同时设置或清除多个标志:(?xy)
可设置 x
和 y
标志,(?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+
匹配任何一个a
或A
,但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+
进行反向匹配找到起始位置。