正規表現構文

適用対象: ✅Microsoft FabricAzure データ エクスプローラーAzure MonitorMicrosoft Sentinel

この記事では、Kusto 照会言語 (KQL)でサポートされる正規表現構文の概要について説明します。

matches regexparsereplace_regex()などの正規表現を使用して文字列の照合、選択、抽出を実行する KQL 演算子と関数は多数あります。

KQL では、正規表現を 文字列リテラルとしてエンコードし 文字列の引用符で囲む規則に従う必要があります。 たとえば、正規表現 \A は KQL で "\\A"として表されます。 余分な円記号は、他の円記号が正規表現 \Aの一部であることを示します。

構文

次のセクションでは、Kusto でサポートされる正規表現の構文について説明します。

1 文字に一致する

パターン 説明
. 改行を除く任意の文字 (s フラグ付きの改行を含む)
[0-9] 任意の ASCII 桁
\d Digit (\p{Nd})
\D 数字ではない
\pX 1 文字の名前で識別される Unicode 文字クラス
\p{Greek} Unicode 文字クラス (一般的なカテゴリまたはスクリプト)
\PX 1 文字の名前で識別される否定 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]] 交差と否定を使用した減算 (4 を除く 0 から 9 に一致)
[0-9--4] 直接減算 (4 を除く 0 から 9 に一致)
[a-g~~b-h] 対称差 (一致する ah のみ)
[\[\]] 文字クラスでのエスケープ (一致する [ または ])
[a&&b] 何も一致しない空の文字クラス

Note

名前付き文字クラスは、角かっこで囲まれた [...] 文字クラス内に含まれる場合があります。 たとえば、 [\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 代替 (x または yxを優先)

繰り返し

パターン 説明
x* 0 個以上の x (最長一致)
x+ 1 つ以上の x (最長一致)
x? 0 または 1 の x (最長一致)
x*? 0 個以上の x (ungreedy/lazy)
x+? 1 つ以上の x (ungreedy/lazy)
x?? ゼロまたは x の 1 つ (ungreedy/lazy)
x{n,m} 少なくとも n x および最大 m x (最長)
x{n,} 少なくとも n x (最長一致)
x{n} 正確に n x
x{n,m}? 少なくとも n x および最大 m x (ungreedy/lazy)
x{n,}? 少なくとも n x (ungreedy/lazy)
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 プロパティに対応し、数値コードポイントは Decimal_NumberLetter_Number 、および Other_Number の一般的なカテゴリの和集合に対応します。

フラグは 1 文字です。 たとえば、(?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 詳細モード。空白を無視し、行コメントを許可します (# 以降)

詳細モードでは、文字クラス内を含め、すべての場所で空白が無視されることに注意してください。 空白を挿入するには、エスケープされた形式または 16 進リテラルを使用します。 たとえば、ASCII 空間の \ \x20 などです。

Note

  • フラグはパターン内で切り替えることができます。 たとえば、次の構文では、最初の部分では大文字と小文字が区別されない一致が使用され、2 番目の部分では大文字と小文字が区別される一致が使用されます: (?i)a+(?-i)b+
  • a+a または Aのいずれかと一致しますが、 b+bにのみ一致します。
  • 複数行モードは、 ^$ 入力の先頭または末尾だけでなく、行の先頭または末尾でも一致しなくなります。 ^は、入力の最後であっても、新しい行の後に一致します。
  • CRLF モードと複数行モードの両方が有効になっている場合、 ^$ は、 \r\nのいずれかと一致しますが、 \r\nの途中には一致しません。
  • Unicode モードは選択的に無効にすることもできますが、結果が無効な UTF-8 と一致 場合にのみ 。 たとえば、Unicode ワード境界ではなく ASCII ワード境界を使用すると、正規表現検索の実行速度が速くなる場合があります。(?-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 8 進数の文字コード(最大 3 桁)
\x7F 16 進文字コード (正確に 2 桁)
\x{10FFFF} Unicode コード ポイントに対応する 16 進文字コード
\u007F 16 進文字コード (正確に 4 桁)
\u{7F} Unicode コード ポイントに対応する 16 進文字コード
\U0000007F 16 進文字コード (正確に 8 桁)
\U{7F} Unicode コード ポイントに対応する 16 進文字コード
\p{Letter} Unicode 文字クラス
\P{Letter} 否定 Unicode 文字クラス
\d\s\w Perl 文字クラス
\D\S\W 否定された Perl 文字クラス

Perl 文字クラス (Unicode フレンドリ)

これらのクラスは、 UTS#18 で提供される定義に基づいています

パターン 説明
\d Ddigit (\p{Nd})
\D 数字以外
\s 空白 (\p{White_Space})
\S 空白ではない
\w Word 文字 (\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:]] Word 文字 ([0-9A-Za-z_])
[[:xdigit:]] 16 進数 ([0-9A-Fa-f])

パフォーマンス

このセクションでは、正規表現式の速度とリソースの使用に関するいくつかのガイダンスを提供します。

Unicode はメモリ使用量と検索速度に影響する可能性があります

KQL 正規表現では、Unicode に対するファースト クラスのサポートが提供されます。 多くの場合、Unicode をサポートするために必要な余分なメモリはごくわずかであり、通常は検索速度には影響しません。

メモリ使用量と検索速度に影響を与える可能性がある Unicode 文字クラスの例を次に示します。

  • メモリ使用量: Unicode の影響は、主に Unicode 文字クラスの使用によって生じます。 Unicode 文字クラスのサイズは大きくなる傾向があります。 たとえば、 \w 文字クラスは、既定で約 140,000 個の個別のコードポイントと一致します。 これには追加のメモリが必要であり、正規表現のコンパイルが遅くなる可能性があります。 ASCII で要件を満たすことができる場合は、Unicode クラスではなく ASCII クラスを使用することをお勧めします。 \wの ASCII 専用バージョンは、複数の方法で表すことができます。これらはすべて同等です。

    [0-9A-Za-z_]
    (?-u:\w)
    [[:word:]]
    [\w&&\p{ascii}]
    
  • 検索速度: Unicode は、大きな Unicode 文字クラスを使用する場合でも、かなり適切に処理される傾向があります。 ただし、より高速な内部正規表現エンジンの中には、Unicode 対応の単語境界アサーションを処理できないものもあります。 そのため、Unicode 対応の単語境界アサーションが不要な場合は、\bではなく(?-u:\b)を使用することを検討してください。 (?-u:\b)では、単語文字の ASCII のみの定義が使用されるため、検索速度を向上させることができます。

リテラルは検索を高速化できる

KQL 正規表現には、正規表現パターン内でリテラルを認識する強力な機能があり、検索を大幅に高速化できます。 可能であれば、パターンにリテラルを含めると、検索のパフォーマンスが大幅に向上します。 たとえば、正規表現 \w+@\w+では、最初に出現する @ が一致し、次に \w+ が開始位置を見つけるために逆一致が実行されます。