RLIKE是MaxCompute SQL提供的一種基於PCRE(Perl Compatible Regular Expressions)規範的操作符,支援在MaxCompute SQL語句中對文本進行更精確、更複雜的模式比對或替換。本文介紹了RLIKE支援的元字元、POSIX字元組、中文字元組、逸出字元和相關字元的使用樣本。
元字元
RLIKE操作符支援一系列元字元,下表列出了常見的元字元:
元字元 | 說明 |
^ | 行首。 |
$ | 行尾。 |
. | 任一字元。 |
* | 匹配前面的子運算式0次或多次。 |
+ | 匹配前面的子運算式1次或多次。 |
? |
|
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}]。