SLS SQL および SPL クエリにおける正規表現関数の構文と使用方法について説明します。
正規表現関数
SLS では以下の正規表現関数がサポートされています。すべての正規表現は RE2 構文 を使用します。
|
関数 |
構文 |
説明 |
SQL |
SPL |
|
regexp_extract_all(x, 正規表現) |
正規表現に一致するすべての部分文字列の配列を返します。 |
√ |
× |
|
|
regexp_extract_all(x, 正規表現, n) |
正規表現のすべての一致箇所から、指定されたキャプチャグループの部分文字列の配列を返します。 |
√ |
× |
|
|
regexp_extract(x, 正規表現) |
正規表現に一致する最初の部分文字列を返します。 |
√ |
√ |
|
|
regexp_extract(x, 正規表現, n) |
正規表現に一致する最初の部分文字列から、n 番目のキャプチャグループの内容を返します。 |
√ |
√ |
|
|
regexp_extract_bool(x, 正規表現) |
最初に一致した部分文字列を BOOLEAN 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_bool(x, 正規表現, n) |
最初の一致箇所の指定されたキャプチャグループの内容を BOOLEAN 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_long(x, 正規表現) |
最初に一致した部分文字列を BIGINT 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_long(x, 正規表現, n) |
最初の一致箇所の指定されたキャプチャグループの内容を BIGINT 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_double(x, 正規表現) |
最初に一致した部分文字列を DOUBLE 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_double(x, 正規表現, n) |
最初の一致箇所の指定されたキャプチャグループの内容を DOUBLE 型に変換します。変換に失敗した場合は |
√ |
× |
|
|
regexp_extract_map(x, 正規表現, keys) |
指定されたキーと対応するキャプチャグループの内容をペアにしてマップを作成します。 |
√ |
× |
|
|
regexp_extract_map(x, 正規表現) |
2 つのキャプチャグループを持つ正規表現からマップを作成します。最初のグループがキーを定義し、2 番目のグループが値を定義します。 |
√ |
× |
|
|
regexp_like(x, 正規表現) |
文字列が正規表現に一致するかどうかをチェックします。 |
√ |
√ |
|
|
regexp_replace(x, 正規表現) |
正規表現に一致するすべての部分文字列を削除します。 |
√ |
√ |
|
|
regexp_replace(x, 正規表現, 置換文字列) |
正規表現に一致するすべての部分文字列を置換文字列に置き換えます。 |
√ |
√ |
|
|
regexp_split(x, 正規表現) |
正規表現をデリミタとして文字列を分割し、結果の部分文字列を配列で返します。 |
√ |
× |
正規表現関数で一重引用符 (') を抽出するには、正規表現内で '' と記述してエスケープしてください。regexp_extract 関数の例 3 でこの方法を紹介しています。
regexp_extract_all 関数
ソース文字列から正規表現に一致するすべての部分文字列を抽出します。
構文
-
ソース文字列から正規表現に一致するすべての部分文字列の配列を返します。
regexp_extract_all(x, 正規表現) -
正規表現内の指定されたキャプチャグループに一致する部分文字列の配列を返します。
regexp_extract_all(x, 正規表現, n)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。VARCHAR 型である必要があります。 |
|
正規表現 |
正規表現。パラメーター n を指定する場合は、キャプチャグループを含む必要があります。たとえば、 |
|
n |
キャプチャグループのインデックス。1 以上の整数である必要があります。 |
戻り値
ARRAY
使用例
-
例 1:
server_protocolフィールドの値からすべての数字を抽出します。-
サンプルフィールド
server_protocol:HTTP/2.0 -
クエリと分析文 (テスト)
*| SELECT regexp_extract_all(server_protocol, '\d+') -
クエリと分析結果:
HTTP/2.0から抽出されたすべての数字の部分文字列が_col0カラムに["2","0"]として返されます。
-
-
例 2:
http_user_agentフィールドの値から 'Chrome' 部分文字列を抽出し、Chrome ブラウザによるリクエスト数をカウントします。-
サンプルフィールド
http_user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 -
クエリと分析文 (テスト)
*| SELECT regexp_extract_all(http_user_agent, '(Chrome)',1) AS Chrome, count(*) AS count GROUP BY Chrome -
クエリと分析結果:
Chromeカラムに["Chrome"]、countカラムに103440が返されます。
-
regexp_extract 関数
ソース文字列から正規表現に一致する最初の部分文字列を抽出します。
構文
-
正規表現に一致する最初の部分文字列を返します。
regexp_extract(x, 正規表現) -
n 番目のキャプチャグループに一致する部分文字列を返します。
regexp_extract(x, 正規表現, n)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。VARCHAR 型である必要があります。 |
|
正規表現 |
正規表現。キャプチャグループを含めることができます。たとえば、 |
|
n |
キャプチャグループのインデックス (1 起点)。正の整数である必要があります。 |
戻り値
VARCHAR 文字列を返します。
使用例
SQL
-
例 1:
server_protocolフィールドから最初の数字を抽出します。-
サンプルフィールド
server_protocol:HTTP/2.0 -
クエリ文 (テスト)
*|SELECT regexp_extract(server_protocol, '\d+') -
クエリは
_col0という名前のカラムを返し、その値は2です。
-
-
例 2:
request_uriフィールドからファイル部分を抽出し、各ファイルへのアクセスリクエスト数をカウントします。-
サンプルフィールド
request_uri:/request/path-3/file-5 -
クエリ文 (テスト)
* | SELECT regexp_extract(request_uri, '.*\/(file.*)', 1) AS file, count(*) AS count GROUP BY file -
サンプル結果:file カラムは
file-5、count カラムは17127です。
-
-
例 3:
messageフィールドから一重引用符 (') と数字を抽出します。-
サンプルフィールド
message:error'1232 -
クエリ文
* | SELECT regexp_extract(message, '''\d+')説明一重引用符 (') に一致させるには、正規表現文字列内で
''と記述してエスケープする必要があります。 -
結果は
'1232です。
-
SPL
-
例 1:server_protocol フィールドから最初の数字を抽出します。
-
サンプルフィールド
-
server_protocol:HTTP/2.0
-
クエリ文
* | extend a = regexp_extract(server_protocol, '\d+')
-
結果
a: 2
-
例 2:
request_uriフィールドからファイル部分を抽出します。-
サンプルフィールド
-
request_uri:/request/path-3/file-5
-
クエリ文
* | extend a = regexp_extract(request_uri, '.*\/(file.*)',1)
-
結果
結果は a: file-5 です。
-
例 3:
messageフィールドから一重引用符 (') と数字を抽出します。-
サンプルフィールド
-
message:error'1232
-
クエリ文
* | extend a = regexp_extract(message, '''\d+')
注記
一重引用符 (') に一致させるには、正規表現文字列内で '' と記述してエスケープする必要があります。
-
結果
1 12-19 10:39:33
a: '1232
regexp_extract_bool 関数
正規表現に一致する部分文字列を抽出し、BOOLEAN 型に変換します。変換は部分文字列が "true" または "false"(大文字小文字を区別しない)の場合にのみ成功し、それ以外の場合は null を返します。
構文
-
ソース文字列から正規表現に一致する部分文字列を抽出し、BOOLEAN 型に変換します。変換に失敗した場合は
nullを返します。regexp_extract_bool(x, 正規表現) -
ソース文字列から正規表現の指定されたキャプチャグループに一致する部分文字列を抽出し、ブール型に変換します。変換に失敗した場合は
nullが返されます。regexp_extract_bool(x, 正規表現, n)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。このパラメーターは VARCHAR 型です。 |
|
正規表現 |
キャプチャグループを含む正規表現。たとえば、 |
|
n |
抽出するキャプチャグループのインデックス。このパラメーターは 1 起点の整数です。 |
戻り値の型
BOOLEAN 型。
使用例
-
フィールド値からブール値を抽出します。
-
サンプルフィールド
false -
クエリと分析文 (テスト)
*| select regexp_extract_bool('false', '[a-zA-Z]+') -
クエリと分析結果
1 行のデータを持つ
_col0カラムを返します。値はfalseです。
-
regexp_extract_long 関数
正規表現に一致する部分文字列を抽出し、BIGINT 型に変換します。変換に失敗した場合は null を返します。
構文
-
正規表現の最初のキャプチャグループに一致する部分文字列を抽出して変換します。
regexp_extract_long(x, 正規表現) -
指定されたキャプチャグループに一致する部分文字列を抽出して変換します。
regexp_extract_long(x, 正規表現, n)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。このパラメーターは VARCHAR 型です。 |
|
正規表現 |
キャプチャグループを含む正規表現。たとえば、 |
|
n |
抽出するキャプチャグループのインデックス。インデックスは 1 起点の整数です。 |
戻り値の型
BIGINT
使用例
-
timeフィールドから数値を抽出します。-
サンプルフィールド
time:19/Dec/2024:06:16:06 -
クエリ文 (テスト)
*|SELECT regexp_extract_long(time, '(\d{2})/', 1) -
クエリと分析結果
_col0という名前のカラムを返し、2 行とも値は19です。
-
regexp_extract_double 関数
正規表現に一致する部分文字列を抽出し、DOUBLE 型に変換します。変換に失敗した場合は null を返します。
構文
-
最初に一致した部分文字列を抽出し、double 型に変換します。変換に失敗した場合は
nullが返されます。regexp_extract_double(x, 正規表現) -
指定されたキャプチャグループの部分文字列を抽出し、double 型に変換します。変換に失敗した場合は
nullが返されます。regexp_extract_double(x, 正規表現, n)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。VARCHAR 型である必要があります。 |
|
正規表現 |
キャプチャグループを含む正規表現。たとえば、 |
|
n |
抽出するキャプチャグループのインデックス。インデックスは 1 から始まる整数です。 |
戻り値の型
double
使用例
-
server_protocolフィールドから浮動小数点数を抽出します。-
サンプルフィールド
server_protocol:HTTP/1.1 -
クエリと分析文 (テスト)
*|SELECT regexp_extract_double(server_protocol, '\d+\.\d+') -
クエリと分析結果
クエリと分析は
_col0という名前のカラムを返します。このカラムには 2 行あり、それぞれの値は1.1です。
-
regexp_extract_map 関数
正規表現のキャプチャグループに一致する部分文字列を抽出し、キーと値のペアのマップとして返します。
構文
-
指定されたキーと対応するキャプチャグループに一致する部分文字列をペアにしてマップを作成します。
regexp_extract_map(x, 正規表現, keys)
-
2 つのキャプチャグループを持つ正規表現を使用して、それぞれキーと値に一致するマップを作成します。
regexp_extract_map(x, 正規表現)
パラメーター
|
パラメーター |
説明 |
|
x |
検索対象のソース文字列。データ型は VARCHAR です。 |
|
正規表現 |
キャプチャグループを含む正規表現。たとえば、 |
|
keys |
キャプチャされた部分文字列のキー名。データ型は ARRAY(VARCHAR) です。キーの数は正規表現内のキャプチャグループの数と一致している必要があります。 |
戻り値の型
MAP(VARCHAR, VARCHAR)
使用例
-
例 1:server_protocol フィールドからプロトコル名とバージョンを抽出します。
-
サンプルフィールド
server_protocol: 'HTTP/2.0' -
クエリ文
select regexp_extract_map(server_protocol, '(\w+)/([\d\.]+)', array['name', 'version']) as protocol -
クエリと分析結果
クエリは protocol カラムに次のマップを返します:
{"name":"HTTP","version":"2.0"}。
-
-
例 2:content フィールドからすべてのキーと値のペアを抽出します。
-
サンプルフィールド
content: 'verb="GET" URI="/healthz" latency="45.911µs" userAgent="kube-probe/1.30+"' -
クエリ文
select regexp_extract_map(content, '(\w+)="([^"]*)"') as args -
出力データ
{"latency":"45.911µs","verb":"GET","userAgent":"kube-probe/1.30+","URI":"/healthz"}
-
regexp_like 関数
文字列が正規表現に一致するかどうかをチェックします。
構文
regexp_like(x, 正規表現)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。VARCHAR 型である必要があります。 |
|
正規表現 |
一致させる正規表現パターン。 |
戻り値の型
BOOLEAN
使用例
SQL
server_protocol フィールドに数字が含まれているかどうかを確認してください。
-
サンプルフィールド
server_protocol:HTTP/2.0 -
クエリと分析文 (テスト)
*| select regexp_like(server_protocol, '\d+') -
クエリは 2 行を返します。両方の値は
trueです。これは、server_protocol フィールドの値が\d+正規表現(数字を含む)に一致することを示しています。
SPL
server_protocol フィールドに数字が含まれているかどうかを確認します。
-
サンプルフィールド
server_protocol:HTTP/2.0
-
クエリと分析文
* |extend a = regexp_like(server_protocol, '\d+')
-
クエリと分析結果
1 12-18 19:34:20 1.2.3.4
a: true
regexp_replace 関数
正規表現に一致する部分文字列を削除または置き換えます。
構文
-
ソース文字列から正規表現に一致するすべての部分文字列を削除します。
regexp_replace(x, 正規表現) -
正規表現に一致するすべての部分文字列を置換文字列に置き換えます。
regexp_replace(x, 正規表現, 置換文字列)
パラメーター
|
パラメーター |
説明 |
|
x |
検索対象のソース文字列。このパラメーターは VARCHAR 型である必要があります。 |
|
正規表現 |
正規表現パターン。 |
|
置換文字列 |
置換文字列。省略された場合、一致した部分文字列は削除されます。 |
戻り値の型
VARCHAR
使用例
SQL
-
例 1:
regionフィールドで、cnで始まるリージョン名を China に置き換え、中国からのリクエスト数をカウントします。-
サンプルフィールド
region:cn-shanghai -
クエリと分析文 (テスト)
* | select regexp_replace(region, 'cn.*','China') AS region, count(*) AS count GROUP BY region -
クエリと分析結果:クエリは 1 行を返し、region カラムは
China、count カラムは168871です。
-
-
例 2:
server_protocolフィールドの値からバージョン番号部分を削除し、各通信プロトコルのリクエスト数をカウントします。-
サンプルフィールド
server_protocol:HTTP/2.0 -
クエリと分析文 (テスト)
*| select regexp_replace(server_protocol, '.\d+') AS server_protocol, count(*) AS count GROUP BY server_protocol -
クエリと分析結果:クエリは 1 行を返し、
server_protocolはHTTP、countは168871です。
-
SPL
-
例 1:
regionフィールドの値で 'cn' で始まるすべてのリージョン名を China に置き換えます。-
サンプルフィールド
-
region:cn-shanghai
-
クエリと分析文
* | extend a = regexp_replace(region, 'cn.*','China')
-
クエリと分析結果
1 12-18 19:34:20 1.2.3.4 a: China -
例 2:
server_protocolフィールドの値からバージョン番号を削除します。-
サンプルフィールド
-
server_protocol:HTTP/2.0
-
クエリと分析文 (テスト)
* | extend a = regexp_replace(server_protocol, '.\d+')
-
クエリと分析結果
クエリは、タイムスタンプ、宛先 IP アドレス 1.2.3.4、およびバージョン番号が削除された server_protocol フィールドを含むログエントリを返します。
regexp_split 関数
正規表現をデリミタとしてソース文字列を分割し、部分文字列の配列を返します。
構文
regexp_split(x, 正規表現)
パラメーター
|
パラメーター |
説明 |
|
x |
ソース文字列。データ型は VARCHAR です。 |
|
正規表現 |
デリミタとして使用する正規表現パターン。 |
戻り値の型
array
使用例
スラッシュ (/) を使用して request_uri フィールドの値を分割します。
-
サンプルフィールド
request_uri:/request/path-0/file-7 -
クエリと分析文 (テスト)
* | SELECT regexp_split(request_uri,'/') -
クエリと分析結果は
["","request","path-0","file-7"]です。