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} | 匹配的次数。 |
[ab] | 匹配括号中的任一字符。模式匹配a或b。 |
[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}]
。
- 本页导读 (1)
- 元字符
- 使用示例
- 字符组
- POSIX字符组
- 中文字符组