すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:正規表現

最終更新日:Apr 25, 2025

このトピックでは、MaxCompute SQL の正規表現でサポートされているメタ文字、文字グループ、およびエスケープ文字について説明します。

メタ文字

次の表に、MaxCompute SQL でサポートされている一般的なメタ文字を示します。

メタ文字

説明

^

文字列の先頭と一致します。

$

文字列の末尾と一致します。

.

任意の 1 文字と一致します。

*

直前の文字または文字パターンと 0 回以上一致します。

+

直前の文字または文字パターンと 1 回以上一致します。

?

  • 直前の文字または文字パターンと 0 回または 1 回一致します。

  • 一致修飾子として機能します。この文字が他の制限文字 (*、+、?、{n}、{n,}、または {n,m}) の後に続く場合、一致パターンは非貪欲になります。非貪欲パターンは、検索対象の文字列内で可能な限り少ない文字と一致しますが、デフォルトの貪欲パターンは、検索対象の文字列内で可能な限り多くの文字と一致します。

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 を使用できます。