SLS のデータ変換で正規表現のマッチング、文字のエスケープ、グループ化をどのように処理するかを説明します。
完全一致
完全一致では、正規表現が文字列全体と一致する必要があります。 例えば、\d+ は、文字列 1234 と完全一致します。
一部の機能は部分一致をサポートしています。完全一致を適用するには、先頭に^を、末尾に$を追加します。例: ^regular expression$。正規表現の完全な構文は、 Python の正規表現の操作リファレンスに記載されています。
次の表に、各関数のマッチングモードを示します。
|
カテゴリ |
関数 |
マッチングモード |
|
グローバル操作関数 |
部分一致 |
|
|
完全一致 |
||
|
完全一致 |
||
|
完全一致 |
||
|
部分一致 |
||
|
式関数 |
パラメータによって制御されます。デフォルトは完全一致です。 |
|
|
部分一致 |
||
|
部分一致 |
||
|
部分一致 |
||
|
パラメータによって制御されます。デフォルトは部分一致です。 |
||
|
部分一致 |
||
|
部分一致 |
マッチングモードの例:
-
regex_match("abc123", r"\d+"): 一致します (デフォルトでは部分一致)。 -
regex_match("abc123", r"\d+", full=True): 一致しません (完全一致が有効)。 -
regex_match("abc123", r"^\d+$"): 一致しません。完全一致モードと同等です。 -
e_search(r'status~="\d+"'): status フィールドの値に一致します。部分一致モードに相当します。 -
e_search(r'status~="^\d+$"'): status フィールド値に一致します。完全一致モードと同等です。
文字のエスケープ
正規表現には特殊文字が含まれます。これらをリテラルとして一致させるには、次のいずれかの方法でエスケープします。
-
バックスラッシュ (\) でエスケープします。
Character escaping に完全な構文が記載されています。
-
str_regex_escape関数を使用します。-
たとえば、
e_drop_fields(str_regex_escape("abc.test"))は abc.test フィールドを削除します。 -
たとえば、
e_drop_fields("abc.test")は abc?test に一致するフィールドを削除します。ここで、クエスチョンマーク (?) は任意の 1 文字を表します。
-
グループ化
丸括弧 () は、繰り返しや後方参照のために式をグループ化します。次の例にその違いを示します。
"""
処理前のログ:
SourceIP: 192.0.2.1
処理後のログ:
SourceIP: 192.0.2.1
ip: 192.0.2.1
"""
# グループなし:
e_regex("SourceIP", r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "ip")
# グループあり:
e_regex("SourceIP", r"\d{1,3}(\.\d{1,3}){3}", "ip")
キャプチャグループ
キャプチャグループは、後方参照で利用するために一致結果を保存します。丸括弧 () が ?: で始まらないグループは、キャプチャグループです。
キャプチャグループは、開き括弧の出現順に、左から右へ1から番号が振られます。たとえば次の式には 3 つのグループがあります。
(\d{4})-(\d{2}-(\d{2}))
1 1 2 3 32
正規表現に標準のキャプチャグループと名前付きキャプチャグループの両方が含まれる場合、標準グループが先に番号付けされ、その後に名前付きグループが続きます。SLS では、式やプログラム内で名前付きグループを名前で直接参照できます。
非キャプチャグループ
非キャプチャグループは、一致した内容を保存しません。丸括弧() が ?: で始まるグループは、非キャプチャグループです。
プログラムまたはプロジェクトに一致させるには、 pro(gram|ject) を使用します。一致のキャッシュが不要な場合は、非キャプチャ形式 pro(?:gram|ject) を使用します。
(?:x) は、結果をキャッシュせずに x に一致し、正規表現演算子で使用する部分式を定義できるようにします。