RLIKE は、Perl Compatible Regular Expressions(PCRE)標準に基づいて MaxCompute SQL が提供する演算子です。 RLIKE 演算子を使用すると、MaxCompute SQL でより正確で複雑なパターンマッチングまたは置換を実行できます。 このトピックでは、RLIKE でサポートされているメタ文字、POSIX 文字グループ、中国語文字グループ、およびエスケープ文字について説明します。 また、関連文字の例も示します。
メタ文字
RLIKE 演算子はさまざまなメタ文字をサポートしています。 次の表に、RLIKE でサポートされている一般的に使用されるメタ文字を示します。
メタ文字 | 説明 |
^ | 文字列の先頭と一致します。 |
$ | 文字列の末尾と一致します。 |
. | 任意の 1 文字と一致します。 |
* | 直前の文字または文字パターンと 0 回以上一致します。 |
+ | 直前の文字または文字パターンと 1 回以上一致します。 |
? |
|
A|B | A または B と一致します。 |
(abc)* | abc シーケンスと 0 回以上一致します。 |
{n} or {m,n} | 一致の数。 {n} は正確な一致数を表し、{m,n} は一致数の範囲を表します。 |
[ab] | 角かっこ内の任意の文字と一致します。 |
[a-d] | 次の文字のいずれかと一致します:a、b、c、および d。 |
[^ab] | ^ は NOT を示します。 この式は、a または b でない任意の文字と一致します。 |
[::] | 詳細については、このトピックで後述するPOSIX 文字グループを参照してください。 |
\ | エスケープ文字。 詳細については、このトピックで後述するエスケープ文字の一致を参照してください。 |
\n | n は 1 から 9 の範囲の数字で、後方参照を示します。 |
\d | 数字。 |
\D | 数字以外の文字。 |
正規表現の詳細については、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] |
MaxCompute は \f と \v をサポートしていません。 サポートされているエスケープ文字の詳細については、エスケープ文字を参照してください。
中国語文字グループ
文字グループ | 有効値 |
中国語文字などの 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. |
+------------+一重引用符と一致させるには、unicode0027 を使用でき、対応する正規表現は [\\x{0027}] です。