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操作符支持反斜线\作为转义符,因此正则表达式的模式中出现的\都要进行二次转义。
- 示例1 - 正则表达式要匹配字符串 - a+b,其中- +是正则中的一个特殊字符,因此要用转义的方式表达。在正则表达式引擎中的表达方式是- a\+b,由于还要解释一层转义,因此能够匹配该字符串的表达式是- a\\+b。- SELECT 'a+b' RLIKE 'a\\+b'; --返回结果如下: +------+ | _c1 | +------+ | true | +------+
- 示例2 - 匹配字符 - \, 在正则表达式引擎中- \是一个特殊字符,因此要表示为- \\,由于还要解释一层转义,因此写成- \\\\。说明- 在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这两个字符时,已经将其存为一个字符,因此在正则表达式的模式中它也是一个普通的字符。- 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码,然后结合运算符来逐个排除。 | 
示例
例如句号(。)对应正则表达式为[\\x{3002}]。
SELECT * FROM VALUES ('你好。'),('nihao!') t(d) WHERE d RLIKE '[\\x{3002}]';
-- 返回结果如下:
+------------+
| d          |
+------------+
| 你好。        |
+------------+如果要匹配单引号,可以用unicode0027,对应正则表达式为 [\\x{0027}]。