MaxCompute SQL中的正则表达式采用的是PCRE的规范,匹配时按字符进行。

RLIKE

您可以使用RLIKE语句匹配正则表达式,支持的元字符如下表所示。
元字符说明
^行首。
$行尾。
.任意字符。
*匹配前面的子表达式0次或多次。
+匹配前面的子表达式1次或多次。
?匹配前面的子表达式0次或1次。
?匹配修饰符,当该字符跟在任何一个其他限制符 (* 、+、?、 {n}、 {n,}、 {n,m})后面时,匹配模式为非贪婪模式。非贪婪模式尽可能少的匹配所搜索的字符串, 而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
A|BA或B。
(abc)*匹配abc序列0次或多次。
{n}或{m,n}匹配的次数。
[ab]匹配括号中的任一字符。模式匹配a或b。
[a-d]匹配a、b、c、d任一字符。
[^ab]^表示非,匹配任一非a非b的字符。
[::]见下表POSIX字符组。
\转义符。
\nn为数字1-9,后向引用。
\d数字。
\D非数字。

字符组

字符组类型字符组说明范围
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]
中文字符组不涉及包括汉字在内的双字节字符[^\\x{00}-\\x{ff}]
不涉及中文字符[\\x{4e00}-\\x{9fa5}]
不涉及中文标点中文标点无统一的编码范围,您可以在搜索引擎上搜索中文标点符号Unicode码,然后结合运算符来逐个排除。

例如句号(。)对应正则表达式为[\\x{3002}]。执行select * from values ('你好。'),('nihao!') t(d) where d rlike '[\\x{3002}]';返回结果为你好。

说明 如果要匹配单引号,可以用unicode0027,对应正则表达式为 [\\x{0027}]

转义符

由于系统采用反斜线\作为转义符,因此正则表达式的模式中出现的\都要进行二次转义。例如正则表达式要匹配字符串a+b。其中+是正则中的一个特殊字符,因此要用转义的方式表达,在正则引擎中的表达方式是a\\+b。由于系统还要解释一层转义,因此能够匹配该字符串的表达式是a\\\+b

示例如下。
select 'a+b' rlike 'a\\\+b';

+------+
| _c1  |
+------+
| true |
+------+
极端的情况,如果要匹配字符\, 由于在正则引擎中\是一个特殊字符,因此要表示为\\,而系统还要对表达式进行一次转义,因此写成\\\\
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 |
+-----+------+
说明 在MaxCompute SQL中写a\\b,而在输出结果中显示a\b,同样是因为MaxCompute会对表达式进行转义。
如果字符串中有制表符TAB,系统在读入\t这两个字符时,已经将其存为一个字符,因此在正则的模式中它也是一个普通的字符。
select 'a\tb', 'a\tb' rlike 'a\tb';

+---------+------+
| _c0     | _c1  |
+---------+------+
| a     b | true |
+---------+------+