このトピックでは、MaxCompute SQL の正規表現でサポートされているメタ文字、文字グループ、およびエスケープ文字について説明します。
メタ文字
次の表に、MaxCompute SQL でサポートされている一般的なメタ文字を示します。
メタ文字 | 説明 |
^ | 文字列の先頭と一致します。 |
$ | 文字列の末尾と一致します。 |
. | 任意の 1 文字と一致します。 |
* | 直前の文字または文字パターンと 0 回以上一致します。 |
+ | 直前の文字または文字パターンと 1 回以上一致します。 |
? |
|
A|B | A または B と一致します。 |
(abc)* | abc シーケンスと 0 回以上一致します。 |
{n} or {m,n} | 一致回数。 |
[ab] | 角かっこ内の任意の文字と一致します。文字は a または b にすることができます。 |
[a-d] | 次の文字のいずれかと一致します: a、b、c、および d。 |
[^ab] | ^ は NOT を示します。この式は、a または b でない任意の文字と一致します。 |
[::] | 詳細については、このトピックで後述するPOSIX 文字グループを参照してください。 |
\ | エスケープ文字。詳細については、このトピックで後述するエスケープ文字のマッチングを参照してください。 |
\n | n は 1 から 9 までの数字で、後方参照を示します。 |
\d | 数字。 |
\D | 数字以外の文字。 |
MaxCompute SQL は、Perl 互換正規表現 (PCRE) をサポートしています。正規表現の詳細については、PCRE ドキュメントを参照してください。
一致結果が期待どおりでない場合は、エスケープ文字のマッチングを参照して、エスケープ文字が必要かどうかを評価してください。
例
一般的なルールのマッチング
文字列の先頭と末尾を一致させる
-- 文字列 aa123bb の先頭が a であるかどうかを一致させます。true が返されます。 SELECT 'aa123bb' RLIKE '^a'; -- 文字列 aa123bb の先頭を a と、文字列 aa123bb の末尾を b と一致させます。true が返されます。 SELECT 'aa123bb' RLIKE '^a.*b$'; -- 文字列 footerbar に foo と bar が順番に含まれているかどうかを一致させます。true が返されます。 SELECT 'footerbar' RLIKE 'foo(.*?)(bar)'; -- 文字列 footerbar が foo で始まり、bar で終わるかどうかを一致させます。true が返されます。 SELECT 'footerbar' RLIKE '^foo(.*?)(bar)$';任意の文字と一致させる
-- 文字列 cc123bb の先頭が a から d までの任意の文字であるかどうかを一致させます。true が返されます。 SELECT 'cc123bb' RLIKE '^[a-d]'; -- 文字列 12abc34 が 12 で始まり、34 で終わり、途中に a から d までの文字が少なくとも 1 つ含まれているかどうかを一致させます。true が返されます。 SELECT '12abc34' RLIKE '^12[a-d]+34$';
エスケープ文字のマッチング
RLIKE 演算子は、バックスラッシュ \ をエスケープ文字としてサポートしています。したがって、正規表現のパターン内のすべての \ 文字は 2 回エスケープする必要があります。
例 1
正規表現は文字列
a+bと一致する必要があります。ここで、+は正規表現の特殊文字です。したがって、エスケープ文字として表現する必要があります。正規表現エンジンでは、a\+bとして表現されます。もう 1 つのエスケープレイヤーが必要なため、この文字列と一致する式はa\\+bです。SELECT 'a+b' RLIKE 'a\\+b'; --次の結果が返されます。 +------+ | _c1 | +------+ | true | +------+例 2
文字
\と一致させるには、正規表現エンジン\は特殊文字であるため、\\として表現する必要があり、もう 1 つのエスケープレイヤーが必要なため、\\\\と記述されます。説明MaxCompute SQL では、
a\\bと記述されますが、出力にはa\bと表示されます。これは、MaxCompute が式をエスケープするためです。SELECT 'a\\b', 'a\\b' RLIKE 'a\\\b'; -- 次の結果が返されます。 +-----+------+ | _c0 | _c1 | +-----+------+ | a\b | false | +-----+------+ SELECT 'a\\b', 'a\\b' RLIKE 'a\\\\b'; -- 次の結果が返されます。 +-----+------+ | _c0 | _c1 | +-----+------+ | a\b | true | +-----+------+例 3
文字列にタブ文字 (TAB) が含まれている場合、システムはこれらの 2 つの文字を読み取るときに、すでに
\tを 1 つの文字として格納しています。したがって、正規表現のパターンでも正規文字です。SELECT 'a\tb', 'a\tb' RLIKE 'a\tb'; -- 次の結果が返されます。 +---------+------+ | _c0 | _c1 | +---------+------+ | a b | true | +---------+------+例 4
数字
\d、数字以外の文字\D、および後方参照\nを含む文字列と一致させる。--文字列 2025maxcompute の先頭が数字であるかどうかを一致させます。true が返されます。 SELECT '2025maxcompute' RLIKE '^\\\d'; --文字列 maxcompute2025test の先頭が数字以外の文字であるかどうかを一致させます。true が返されます。 SELECT 'maxcompute2025test' RLIKE '^\\\D'; --文字列 alibaba-cloud-MC2025-test に MC と数字の組み合わせが含まれているかどうかを一致させます。true が返されます。 SELECT 'alibaba-cloud-MC2025-test' RLIKE 'MC\\\d'; -- 文字列 alibaba-cloud-MC2025-test に MC と 4 桁の数字の組み合わせが含まれているかどうかを一致させます。true が返されます。 SELECT 'alibaba-cloud-MC2025-test' RLIKE 'MC\\\d{4}-'; -- 文字列に abcdefdef が含まれているかどうかを一致させます。true が返されます。 -- abc はキャプチャグループ 1、def はキャプチャグループ 2、\2 は 2 番目のキャプチャグループの繰り返しマッチングを表し、\\\2 として再度エスケープする必要があります。つまり、abcdefdef です。 SELECT 'mmabcdefdefgg' RLIKE '(abc)(def)\\\2';
POSIX 文字グループ
文字グループ | 説明 | 有効値 |
[[:alnum:]] | 文字と数字 | [a-zA-Z0-9] |
[[:alpha:]] | 文字 | [a-zA-Z] |
[[:ascii:]] | ASCII 文字 | [\x00-\x7F] |
[[:blank:]] | スペースとタブ文字 | [ \t] |
[[:cntrl:]] | 制御文字 | [\x00-\x1F\x7F] |
[[:digit:]] | 数字 | [0-9] |
[[:graph:]] | 空白文字以外の文字 | [\x21-\x7E] |
[[:lower:]] | 小文字 | [a-z] |
[[:print:]] | [:graph:] と空白文字 | [\x20-\x7E] |
[[:punct:]] | 句読点 | [][!"#$%&'()*+,./:;<=>? @\^_`{|}~-] |
[[:space:]] | 空白文字 | [ \t\r\n\v\f] |
[[:upper:]] | 大文字 | [A-Z] |
[[:xdigit:]] | 16 進文字 | [A-Fa-f0-9] |
中国語文字グループ
中国語文字グループ | 有効値 |
中国語などの 2 バイト文字 | [^\\x{00}-\\x{ff}] |
中国語 | [\\x{4e00}-\\x{9fa5}] |
中国語の句読点 | 中国語の句読点には統一されたエンコーディング範囲がありません。中国語の句読点 Unicode を検索エンジンで検索し、演算子を使用して 1 つずつ除外することができます。 |
例
たとえば、ピリオド (。) の正規表現は [\\x{3002}] です。
SELECT * FROM VALUES ('Hello.'),('nihao!') t(d) WHERE d RLIKE '[\\x{3002}]';
-- 次の結果が返されます。
+------------+
| d |
+------------+
| Hello. |
+------------+単一引用符と一致させるには、正規表現 [\\x{0027}] に対応する unicode0027 を使用できます。