RLIKE字符匹配

更新时间:2025-04-11 08:12:26

RLIKEMaxCompute SQL提供的一种基于PCRE(Perl Compatible Regular Expressions)规范的操作符,支持在MaxCompute SQL语句中对文本进行更精确、更复杂的模式匹配或替换。本文介绍了RLIKE支持的元字符、POSIX字符组、中文字符组、转义字符和相关字符的使用示例。

元字符

RLIKE操作符支持一系列元字符,下表列出了常见的元字符:

元字符

说明

元字符

说明

^

行首。

$

行尾。

.

任意字符。

*

匹配前面的子表达式0次或多次。

+

匹配前面的子表达式1次或多次。

?

  • 匹配前面的子表达式0次或1次。

  • 匹配修饰符,当该字符跟在任何一个其他限制符(* 、+、?、 {n}、 {n,}、 {n,m})后面时,匹配模式为非贪婪模式。非贪婪模式尽可能少地匹配所搜索的字符串, 而默认的贪婪模式则尽可能多地匹配所搜索的字符串。

A|B

AB。

(abc)*

匹配abc序列0次或多次。

{n}或{m,n}

匹配的次数。

[ab]

匹配括号中的任一字符。模式匹配ab。

[a-d]

匹配a、b、c、d任一字符。

[^ab]

^表示非,匹配任一非ab的字符。

[::]

详情请参见下文的POSIX字符组

\

转义符,详情请参见下文的转义字符匹配

\n

n为数字1~9,表示后向引用。

\d

数字。

\D

非数字。

  • 关于更多的正则表达式的使用说明,详情请参见PCRE官网文档

  • 如果匹配结果不符合预期,可以参考转义字符匹配评估是否需要进行转义。

使用示例

一般规则匹配

  • 匹配字符串的开头和结尾

    -- 匹配字符串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字符组
  • 中文字符组