全部產品
Search
文件中心

MaxCompute:RLIKE字元匹配

更新時間:May 14, 2025

RLIKE是MaxCompute SQL提供的一種基於PCRE(Perl Compatible Regular Expressions)規範的操作符,支援在MaxCompute SQL語句中對文本進行更精確、更複雜的模式比對或替換。本文介紹了RLIKE支援的元字元、POSIX字元組、中文字元組、逸出字元和相關字元的使用樣本。

元字元

RLIKE操作符支援一系列元字元,下表列出了常見的元字元:

元字元

說明

^

行首。

$

行尾。

.

任一字元。

*

匹配前面的子運算式0次或多次。

+

匹配前面的子運算式1次或多次。

?

  • 匹配前面的子運算式0次或1次。

  • 匹配修飾符,當該字元跟在任何一個其他限制符(* 、+、?、 {n}、 {n,}、 {n,m})後面時,匹配模式為非貪婪模式。非貪婪模式儘可能少地匹配所搜尋的字串, 而預設的貪婪模式則儘可能多地匹配所搜尋的字串。

A|B

A或B。

(abc)*

匹配abc序列0次或多次。

{n}或{m,n}

匹配的次數。{n}代表準確的匹配次數,{m,n}為匹配次數區間。

[ab]

匹配括弧中的任一字元。

[a-d]

匹配a、b、c、d任一字元。

[^ab]

^表示非,匹配任一非a非b的字元。

[::]

詳情請參見下文的POSIX字元組

\

轉義符,詳情請參見下文的逸出字元匹配

\n

n為數字1~9,表示後向引用。

\d

數字。

\D

非數字。

使用樣本

一般規則匹配

  • 匹配字串的開頭和結尾

    -- 匹配字串aa123bb的開頭是否為a,返回true
    SELECT 'aa123bb' RLIKE '^a';
    
    -- 匹配字串aa123bb的開頭是否為a、結尾是否為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任意一個字元,返回true
    SELECT '12abc34' RLIKE '^12[a-d]+34$';

逸出字元匹配

RLIKE操作符支援反斜線\作為轉義符,因此Regex的模式中出現的\都要進行二次轉義。

  • 樣本1

    Regex要匹配字串a+b,其中+是正則中的一個特殊字元,因此要用轉義的方式表達。在Regex引擎中的表達方式是a\+b,由於還要解釋一層轉義,因此能夠匹配該字串的運算式是a\\+b

    SELECT 'a+b' RLIKE 'a\\+b';
    
    --返回結果如下:
    +------+
    | _c1  |
    +------+
    | true |
    +------+
  • 樣本2

    匹配字元\, 在Regex引擎中\是一個特殊字元,因此要表示為\\,由於還要解釋一層轉義,因此寫成\\\\

    說明

    在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,系統在讀入\t這兩個字元時,已經將其存為一個字元,因此在Regex的模式中它也是一個普通的字元。

    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。即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:]]

十六進位字元

[A-Fa-f0-9]

說明

MaxCompute不支援\f\v,具體支援的轉義符請參見逸出字元

中文字元組

中文字元組細分

範圍

包括漢字在內的雙位元組字元

[^\\x{00}-\\x{ff}]

中文字元

[\\x{4e00}-\\x{9fa5}]

中文標點

中文標點無統一的編碼範圍,您可以在搜尋引擎上搜尋中文標點符號Unicode碼,然後結合運算子來逐個排除。

樣本

例如句號()對應Regex為[\\x{3002}]

SELECT * FROM VALUES ('你好。'),('nihao!') t(d) WHERE d RLIKE '[\\x{3002}]';

-- 返回結果如下:
+------------+
| d          |
+------------+
| 你好。        |
+------------+
說明

如果要匹配單引號,可以用unicode0027,對應Regex為 [\\x{0027}]