Regex 語法

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft 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) 具名 (也編號) 擷取群組 (名稱必須是英數位)
(?<name>exp) 具名 (也編號) 擷取群組 (名稱必須是英數位)
(?:exp) 非擷取群組
(?flags) 設定目前群組內的旗標
(?flags:exp) 設定 exp 的旗標 (非擷取)

擷取組名只能包含英數位元 Unicode 字碼點、點 .、底線 _和方括弧[]。 名稱開頭必須是 _ 或字母代碼點。 字母代碼點會對應至 Alphabetic Unicode 屬性,而數值代碼點則對應至 、 Letter_NumberOther_Number 一般類別的Decimal_Number聯集。

旗標為單一字元。 例如, (?x) 設定旗標 x(?-x) 清除 旗標 x。 可以同時設定或清除多個旗標:(?xy)同時設定 和 y 旗標,並(?x-y)設定x旗標並清除yx旗標。 除非另有說明,否則預設會停用所有旗標。 畫面如下:

旗標 描述
i 不區分大小寫:字母符合大寫和小寫
m 多行模式: ^$ 比對行的開始/結束
s 允許點 (.. ) 。 比對 \n
R 啟用CRLF模式:啟用多行模式時, \r\n 會使用
U 交換和的意義x*x*?
u Unicode 支援 (預設為啟用)
x 詳細資訊模式,忽略空白符並允許行批註 (從 #開始)

請注意,在詳細資訊模式中,會在任何地方忽略空格符,包括字元類別內。 若要插入空格符,請使用其逸出形式或十六進位常值。 例如, \ \x20 ASCII 空間。

注意

  • 旗標可以在模式內切換。 例如,下列語法會針對第一個部分使用不區分大小寫的比對,而第二個部分則使用區分大小寫的比對: (?i)a+(?-i)b+
  • a+會比對 a 或 ,但b+唯一符合 bA
  • 多行模式表示 ^$ 不再只比對輸入的開頭或結尾,也可以在行的開頭或結尾。 請注意, ^ 符合新行之後,即使在輸入結尾也一致。
  • 啟用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+ 反向比對來尋找起始位置。