RLIKE字符匹配
RLIKE是MaxCompute SQL提供的一種基于PCRE(Perl Compatible Regular Expressions)規(guī)范的操作符,支持在MaxCompute SQL語(yǔ)句中對(duì)文本進(jìn)行更精確、更復(fù)雜的模式匹配或替換。本文介紹了RLIKE支持的元字符、POSIX字符組、中文字符組、轉(zhuǎn)義字符和相關(guān)字符的使用示例。
元字符
RLIKE操作符支持一系列元字符,下表列出了常見的元字符:
元字符 | 說(shuō)明 |
^ | 行首。 |
$ | 行尾。 |
. | 任意字符。 |
* | 匹配前面的子表達(dá)式0次或多次。 |
+ | 匹配前面的子表達(dá)式1次或多次。 |
? | 匹配前面的子表達(dá)式0次或1次。 |
? | 匹配修飾符,當(dāng)該字符跟在任何一個(gè)其他限制符 (* 、+、?、 {n}、 {n,}、 {n,m})后面時(shí),匹配模式為非貪婪模式。非貪婪模式盡可能少的匹配所搜索的字符串, 而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。 |
A|B | A或B。 |
(abc)* | 匹配abc序列0次或多次。 |
{n}或{m,n} | 匹配的次數(shù)。 |
[ab] | 匹配括號(hào)中的任一字符。模式匹配a或b。 |
[a-d] | 匹配a、b、c、d任一字符。 |
[^ab] | ^表示非,匹配任一非a非b的字符。 |
[::] | 詳情請(qǐng)參見下文的POSIX字符組。 |
\ | 轉(zhuǎn)義符,詳情請(qǐng)參見下文的轉(zhuǎn)義符。 |
\n | n為數(shù)字1~9,表示后向引用。 |
\d | 數(shù)字。 |
\D | 非數(shù)字。 |
關(guān)于更多的正則表達(dá)式的使用說(shuō)明,詳情請(qǐng)參見PCRE官網(wǎng)文檔。
如果匹配結(jié)果不符合預(yù)期,可能是需要做轉(zhuǎn)義,詳情請(qǐng)參見轉(zhuǎn)義字符。
使用示例
示例:匹配字符串的開頭和結(jié)尾
select 'aa123bb' rlike '^a'; -- 匹配字符串a(chǎn)a123bb的開頭是否為a,返回true select 'aa123bb' rlike '^a.*b$'; -- 匹配字符串a(chǎn)a123bb的開頭是否為a、結(jié)尾是否為b,運(yùn)行返回true select 'footerbar' rlike 'foo(.*?)(bar)'; -- 返回true
示例:使用轉(zhuǎn)義符匹配含特殊字符的字符串
select 'a+b' rlike 'a\\\+b'; -- 返回true
示例:匹配任一字符
select 'cc123bb' rlike '^[a-d]'; -- 匹配字符串cc123bb的開頭是否是a~d中的任意一個(gè)字符,返回true
示例:匹配數(shù)字、非數(shù)字字符
select '123bb' rlike '^\\\d'; -- 匹配字符串123bb的開頭是否是數(shù)字字符,返回true select 'cc123bb' rlike '^\\\D'; -- 匹配字符串cc123bb的開頭是否是非數(shù)字字符,返回true
字符組
POSIX字符組
字符組 | 說(shuō)明 | 范圍 |
[[:alnum:]] | 字母字符和數(shù)字字符 | [a-zA-Z0-9] |
[[:alpha:]] | 字母 | [a-zA-Z] |
[[:ascii:]] | ASCII字符 | [\x00-\x7F] |
[[:blank:]] | 空格字符和制表符 | [ \t] |
[[:cntrl:]] | 控制字符 | [\x00-\x1F\x7F] |
[[:digit:]] | 數(shù)字字符 | [0-9] |
[[:graph:]] | 空白字符之外的字符 | [\x21-\x7E] |
[[:lower:]] | 小寫字母字符 | [a-z] |
[[:print:]] | [:graph:]和空白字符 | [\x20-\x7E] |
[[:punct:]] | 標(biāo)點(diǎn)符號(hào) | [][!”#$%&’()*+,./:;<=>? @\^_`{|}~-] |
[[:space:]] | 空白字符 | [ \t\r\n\v\f] |
[[:upper:]] | 大寫字母字符 | [A-Z] |
[[:xdigit:]] | 十六進(jìn)制字符 | [A-Fa-f0-9] |
MaxCompute不支持\f
和\v
,具體支持的轉(zhuǎn)義符請(qǐng)參見轉(zhuǎn)義字符。
中文字符組
中文字符組細(xì)分 | 范圍 |
包括漢字在內(nèi)的雙字節(jié)字符 | [^\\x{00}-\\x{ff}] |
中文字符 | [\\x{4e00}-\\x{9fa5}] |
中文標(biāo)點(diǎn) | 中文標(biāo)點(diǎn)無(wú)統(tǒng)一的編碼范圍,您可以在搜索引擎上搜索中文標(biāo)點(diǎn)符號(hào)Unicode碼,然后結(jié)合運(yùn)算符來(lái)逐個(gè)排除。 例如句號(hào)(。)對(duì)應(yīng)正則表達(dá)式為 說(shuō)明 如果要匹配單引號(hào),可以用 |
轉(zhuǎn)義符
RLIKE操作符支持反斜線\
作為轉(zhuǎn)義符,因此正則表達(dá)式的模式中出現(xiàn)的\
都要進(jìn)行二次轉(zhuǎn)義。
使用示例
示例1
正則表達(dá)式要匹配字符串
a+b
,其中+
是正則中的一個(gè)特殊字符,因此要用轉(zhuǎn)義的方式表達(dá)。在正則表達(dá)式引擎中的表達(dá)方式是a\\+b
,由于還要解釋一層轉(zhuǎn)義,因此能夠匹配該字符串的表達(dá)式是a\\\+b
。select 'a+b' rlike 'a\\\+b'; +------+ | _c1 | +------+ | true | +------+
示例2
在某些情況下,如果要匹配字符
\
, 在正則表達(dá)式引擎中\
是一個(gè)特殊字符,因此要表示為\\
,由于還要解釋一層轉(zhuǎn)義,因此寫成\\\\
。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 | +-----+------+
說(shuō)明在MaxCompute SQL中寫
a\\b
,而在輸出結(jié)果中顯示a\b
,同樣是因?yàn)镸axCompute會(huì)對(duì)表達(dá)式進(jìn)行轉(zhuǎn)義。示例3
如果字符串中有制表符TAB,系統(tǒng)在讀入
\t
這兩個(gè)字符時(shí),已經(jīng)將其存為一個(gè)字符,因此在正則表達(dá)式的模式中它也是一個(gè)普通的字符。select 'a\tb', 'a\tb' rlike 'a\tb'; +---------+------+ | _c0 | _c1 | +---------+------+ | a b | true | +---------+------+