你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
正则表达式语法
适用于:✅Microsoft Fabric✅Azure 数据资源管理器Azure Monitor✅Microsoft✅ Sentinel
本文概述了 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 匹配的字符类(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] |
对称差集(仅匹配 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) |
命名(也编号)捕获组(名称必须为 alpha-numeric) |
(?<name>exp) |
命名(也编号)捕获组(名称必须为 alpha-numeric) |
(?:exp) |
非捕获组 |
(?flags) |
在当前组中设置标志 |
(?flags:exp) |
为 exp 设置标志(非捕获) |
捕获组名称只能包含字母数字 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 |
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+
查找起始位置。