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}
匹配的次数。
[ab]
匹配括号中的任一字符。模式匹配a或b。
[a-d]
匹配a、b、c、d任一字符。
[^ab]
^表示非,匹配任一非a非b的字符。
[::]
详情请参见下文的 POSIX字符组 。
\
转义符,详情请参见下文的 转义符 。
\n
n为数字1~9,表示后向引用。
\d
数字。
\D
非数字。
关于更多的正则表达式的使用说明,详情请参见 PCRE官网文档 。
如果匹配结果不符合预期,可能是需要做转义,详情请参见 转义字符 。
示例:匹配字符串的开头和结尾
select 'aa123bb' rlike '^a'; -- 匹配字符串aa123bb的开头是否为a,返回true select 'aa123bb' rlike '^a.*b$'; -- 匹配字符串aa123bb的开头是否为a、结尾是否为b,运行返回true select 'footerbar' rlike 'foo(.*?)(bar)'; -- 返回true
示例:使用转义符匹配含特殊字符的字符串
select 'a+b' rlike 'a\\\+b'; -- 返回true
示例:匹配任一字符
select 'cc123bb' rlike '^[a-d]'; -- 匹配字符串cc123bb的开头是否是a~d中的任意一个字符,返回true
示例:匹配数字、非数字字符
select '123bb' rlike '^\\\d'; -- 匹配字符串123bb的开头是否是数字字符,返回true select 'cc123bb' rlike '^\\\D'; -- 匹配字符串cc123bb的开头是否是非数字字符,返回true
字符组
范围
[[: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 ,具体支持的转义符请参见 转义字符 。
\f
\v
中文字符组细分
包括汉字在内的双字节字符
[^\\x{00}-\\x{ff}]
中文字符
[\\x{4e00}-\\x{9fa5}]
中文标点
中文标点无统一的编码范围,您可以在搜索引擎上搜索 中文标点符号Unicode码 ,然后结合运算符来逐个排除。
例如句号(。)对应正则表达式为 [\\x{3002}] 。执行 select * from values ('你好。'),('nihao!') t(d) where d rlike '[\\x{3002}]'; 返回结果为 你好。 。
[\\x{3002}]
select * from values ('你好。'),('nihao!') t(d) where d rlike '[\\x{3002}]';
你好。
如果要匹配单引号,可以用 unicode0027 ,对应正则表达式为 [\\x{0027}] 。
unicode0027
[\\x{0027}]
RLIKE操作符支持反斜线 \ 作为转义符,因此正则表达式的模式中出现的 \ 都要进行二次转义。
示例1
正则表达式要匹配字符串 a+b ,其中 + 是正则中的一个特殊字符,因此要用转义的方式表达。在正则表达式引擎中的表达方式是 a\\+b ,由于还要解释一层转义,因此能够匹配该字符串的表达式是 a\\\+b 。
a+b
a\\+b
a\\\+b
select 'a+b' rlike 'a\\\+b'; +------+ | _c1 | +------+ | true | +------+
示例2
在某些情况下,如果要匹配字符 \ , 在正则表达式引擎中 \ 是一个特殊字符,因此要表示为 \\ ,由于还要解释一层转义,因此写成 \\\\ 。
\\
\\\\
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会对表达式进行转义。
a\\b
a\b
示例3
如果字符串中有制表符TAB,系统在读入 \t 这两个字符时,已经将其存为一个字符,因此在正则表达式的模式中它也是一个普通的字符。
\t
select 'a\tb', 'a\tb' rlike 'a\tb'; +---------+------+ | _c0 | _c1 | +---------+------+ | a b | true | +---------+------+