Regex 語法
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅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) |
具名 (也編號) 擷取群組 (名稱必須是英數位) |
(?<name>exp) |
具名 (也編號) 擷取群組 (名稱必須是英數位) |
(?:exp) |
非擷取群組 |
(?flags) |
設定目前群組內的旗標 |
(?flags:exp) |
設定 exp 的旗標 (非擷取) |
擷取組名只能包含英數位元 Unicode 字碼點、點 .
、底線 _
和方括弧[
和 ]
。 名稱開頭必須是 _
或字母代碼點。 字母代碼點會對應至 Alphabetic
Unicode 屬性,而數值代碼點則對應至 、 Letter_Number
和 Other_Number
一般類別的Decimal_Number
聯集。
旗標為單一字元。 例如, (?x)
設定旗標 x
並 (?-x)
清除 旗標 x
。 可以同時設定或清除多個旗標:(?xy)
同時設定 和 y
旗標,並(?x-y)
設定x
旗標並清除y
x
旗標。 除非另有說明,否則預設會停用所有旗標。 畫面如下:
旗標 | 描述 |
---|---|
i |
不區分大小寫:字母符合大寫和小寫 |
m |
多行模式: ^ 和 $ 比對行的開始/結束 |
s |
允許點 (.. ) 。 比對 \n |
R |
啟用CRLF模式:啟用多行模式時, \r\n 會使用 |
U |
交換和的意義x* x*? |
u |
Unicode 支援 (預設為啟用) |
x |
詳細資訊模式,忽略空白符並允許行批註 (從 # 開始) |
請注意,在詳細資訊模式中,會在任何地方忽略空格符,包括字元類別內。 若要插入空格符,請使用其逸出形式或十六進位常值。 例如, \
或 \x20
ASCII 空間。
注意
- 旗標可以在模式內切換。 例如,下列語法會針對第一個部分使用不區分大小寫的比對,而第二個部分則使用區分大小寫的比對:
(?i)a+(?-i)b+
。 a+
會比對a
或 ,但b+
唯一符合b
A
。- 多行模式表示
^
和$
不再只比對輸入的開頭或結尾,也可以在行的開頭或結尾。 請注意,^
符合新行之後,即使在輸入結尾也一致。 - 啟用CRLF模式和多行模式時,然後
^
$
比對和\r
\n
,但絕不會在中間\r\n
。 - Unicode 模式也可以選擇性地停用,但只有在結果 不符合 無效的 UTF-8 時。 例如,使用 ASCII 字界限而非 Unicode 字界限可能會讓某些 regex 搜尋執行得更快:
(?-u:\b).+(?-u:\b)
比對$$abc$$
。
逸出序列
模式 | 描述 |
---|---|
\* |
常值 * ,適用於所有 ASCII,但除外 [0-9A-Za-z<>] |
\a |
貝爾(\x07 ) |
\f |
表單摘要 (\x0C ) |
\t |
水平 Tab 鍵 |
\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 |
文字字元 (\p{Alphabetic} \d \p{M} \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] ) |
效能
本節提供 regex 運算式的速度和資源使用量的一些指引。
Unicode 可能會影響記憶體使用量和搜尋速度
KQL regex 提供 Unicode 的第一類支援。 在許多情況下,支援 Unicode 所需的額外記憶體是微不足道的,而且通常不會影響搜尋速度。
以下是可能會影響記憶體使用量和搜尋速度之 Unicode 字元類別的一些範例:
記憶體使用量:Unicode 的影響主要來自於 Unicode 字元類別的使用。 Unicode 字元類別的大小往往較大。 例如,
\w
字元類別預設會比對大約 140,000 個不同的代碼點。 這需要額外的記憶體,而且可能會讓 regex 編譯變慢。 如果您的需求可由 ASCII 滿足,建議您使用 ASCII 類別,而不是 Unicode 類別。 只有 ASCII 的版本\w
可以透過多種方式來表示,這一切都是相等的。[0-9A-Za-z_] (?-u:\w) [[:word:]] [\w&&\p{ascii}]
搜尋速度:即使使用大型 Unicode 字元類別,Unicode 也通常會相當妥善地處理。 不過,某些較快速的內部 Regex 引擎無法處理 Unicode 感知字邊界判斷提示。 因此,如果您不需要 Unicode 感知字邊界判斷提示,您可能會考慮使用
(?-u:\b)
而不是\b
。 會(?-u:\b)
使用僅限 ASCII 的單字字元定義,以改善搜尋速度。
常值可以加速搜尋
KQL regex 具有在 regex 模式中辨識常值的強大能力,這可以大幅加快搜尋速度。 可能的話,在您的模式中包含常值可以大幅改善搜尋效能。 例如,在 regex \w+@\w+
中,會比對 第一個出現的 @
,然後執行 \w+
反向比對來尋找起始位置。