odps sql 常用正则表达式
生活随笔
收集整理的這篇文章主要介紹了
odps sql 常用正则表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
regexp_substr
- 命令格式:
regexp_substr(source, pattern[,start_position[,nth_occurrence]]) - 返回值:
source中匹配pattern指定模式的子串,任一輸入參數為NULL返回NULL。 - 參數說明:
-
- source: string類型,搜索的字符串。
-
- pattern: string類型常量,要匹配的模型,pattern為空串時拋異常。
-
- start_position: 整型常量,必須大于0。其它類型或小于等于0時拋異常,不指定時默認為1, 表示從source的第一個字符開始匹配。
-
- nth_occurrence:整型常量,必須大于0,其它類型或小于等于0時拋異常。不指定時默認為1,表示返回第一次匹配的子串。
- 用途:
返回字符串source從start_position開始, 和pattern第n次(nth_occurrence)匹配的子串,沒有匹配時返回NULL。
示例:
- 提取字符串中的數字 select regexp_substr('CYJ8-ABC','[0-9]+') ;>8 select regexp_substr('mint choc中文12國3','[0-9]+',1,1);>12select regexp_substr('mint choc中文12國3','[0-9]+',1,2); >3 SELECT regexp_substr('MLSP1_341',"[0-9]+",1,1) >1 SELECT regexp_substr('MLSP1_341',"[0-9]+",1,2) >341 SELECT split_part('MLSP1_341','_',1) >MLSP1 SELECT split_part('MLSP1_341','_',2) >341regexp_replace
-
命令格式:
regexp_replace(source, pattern, replace_string, occurrence) -
返回值:
將source字符串中匹配pattern的子串替換成指定字符串后返回,當輸入source, pattern, occurrence參數為NULL時返回NULL,若replace_string為NULL且pattern有匹配,返回NULL,replace_string為NULL但pattern不匹配,則返回原串。 -
參數說明:
-
- source: string類型,要替換的字符串。
-
- pattern: string類型常量,要匹配的模式,pattern為空串時拋異常。
-
- replace_string:string,將匹配的pattern替換成的字符串。
-
- occurrence: bigint類型常量,必須大于等于0,表示將第幾次匹配替換成replace_string,為0時表示替換掉所有的匹配子串。其它類型或小于0拋異常。
-
- 當引用不存在的組時,不進行替換。
例如:
regexp_replace("123.456.7890","([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})","(\\1)\\2-\\3",0) 結果為(123)456-7890regexp_replace("abcd","(.)","\\1 ",0) 結果為"a b c d "regexp_replace("abcd","(.)","\\1 ",1) 結果為"a bcd"regexp_replace("abcd","(.)","\\2",1) 結果為"abcd",因為pattern中只定義了一個組,引用的第二個組不存在。regexp_replace("abcd","(.*)(.)$","\\2",0) 結果為"d"regexp_replace("abcd","a","\\1",0),結果為” \1bcd”,因為在pattern中沒有組的定義,所以\1直接輸出為字符。RLIKE == REGEXP
| 元字符 | 說明 |
| ^ | 匹配開頭 |
| $ | 匹配結尾 |
| . | 匹配任意單個字符 |
| * | 匹配0個或多個前一個得到的字符。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價于{0,} |
| + | 匹配1次或多次前一個得到的字符。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價于 {1,} |
| ? | 匹配0次或1次 |
| ? | 匹配修飾符,當該字符跟在任何一個其他限制符 (* 、+、?、 {n}、 {n,}、 {n,m})后面時,匹配模式為非貪婪模式。非貪婪模式盡可能少的匹配所搜索的字符串, 而默認的貪婪模式則盡可能多的匹配所搜索的字符串 |
| A|B | 匹配A或B |
| (…) | 將模式元素組成單一元素 |
| {n} | 匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o |
| {n,m} | m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
| […] | 匹配出括號內的任意字符 |
| [^…] | 匹配不包含在[]的字符 |
| [a-d] | 匹配a、b、c、d任一字符 |
解釋
| 元字符 | 說明 |
| ^a | 匹配開頭,如^a匹配以a或者A開頭的字符串 |
| a$ | 匹配結尾,如a$匹配以a或者A結尾的字符串 |
| a* | 匹配出0個或多個a (包括空符) |
| a+ | 匹配出1個或多個a (不包括空符) |
| a? | 匹配出1個或0個a |
| a(m) | 匹配m個a |
| a(m,) | 匹配m個或更多個a |
| a(m,n) | 匹配m到n個a |
| a(,n) | 匹配0到n個a |
| (abc)* | 匹配abc序列0次或多次。abc是一個整體 |
| A|B | 例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food” |
| [ab] | 匹配括號中的任一字符。模式匹配a或b |
| […^] | 匹配補充括號內的任意字符 |
舉例1
^ 匹配字符串開始位置,查詢所有姓王的人名 select name from 表名 where name regexp '^王';$ 匹配字符串結束位置,如查詢所有姓名末尾是“明”的人名 select name from 表名 where name regexp '明$';. 匹配除\n之外的任意單個字符,類似于_[……] 匹配[]中包含的任何一個字符abcdef……xyz可以簡寫為[a-z],0123456789簡寫成[0-9], 如查詢出包含w/z/s的人名 select name from 表名 where name regexp '[wzs]'; 如查詢出不包含w/z/s的人名 select name from 表名 where name regexp '[^wzs]'; 如查詢出w/z/s開頭的的人名 select name from 表名 where name regexp '^[wzs]';[^……] 匹配不包含在[]的字符,如查詢出除了w/z/s開頭之外的人名 select name from 表名 where name regexp '^[^wzs]';a|b|c 匹配a或b或c,如將績效為A-或A或A+的員工查出來,假設績效列名performance select performance from 表名 where performance regexp 'A-|A|A+';* 匹配前面的子表達式0次或多次 * 等價于{0,} 'str*'可以匹配st/str/strr/strrr……? 重復0次或1次 'str?' 可以匹配st/str+ 重復1次或多次 + 等價于 {1,} 'str+'可以匹配str/strr/strrr/strrrr……** 舉例2**
SELECT 'abvsdfcsd' REGEXP'^a' --->1 返回結果1表示匹配,返回結果0表示不匹配.匹配到開頭為a返回1SELECT 'abvsdfcsd' REGEXP'd$' --->1 匹配到末尾為d返回1SELECT 'abvsdfcsd' REGEXP'.f','abvsdfcsd' REGEXP'.h' --->1 0 匹配到其后面的字符返回為1SELECT 'abvsdfcsd' REGEXP '[fhk]' --->1 任意字符匹配上即返回為1SELECT 'efg' REGEXP '^[XYZ]','efg' REGEXP '[^XYZ]','efg' REGEXP '^[^XYZ]'; --->0 1 1 REGEXP '^[XYZ]' 查詢以X Y Z 開頭的 REGEXP '[^XYZ]' 查詢不包含X Y Z 的 REGEXP '^[^XYZ]' 查詢 不以X Y Z 開頭的SELECT 'abc' REGEXP '[^a]' --->1 'abc'作為一個整體,所以它匹配不了aSELECT 'stab' REGEXP '.ta*b'; --->1 匹配到一個t 0個或多個a 一個 b返回1SELECT 'stab' REGEXP '.tba*'; --->0 注意區別SELECT '' REGEXP 'a*' --->1 包括字符串。可以當占位符使用SELECT 'stab' REGEXP '.ta+b'; --->1SELECT 'stb' REGEXP '.ta+b';--->0 SELECT 'stb' REGEXP '.ta?b'; --->1 SELECT 'stab' REGEXP '.ta?b'; --->1 SELECT 'staab' REGEXP '.ta?b'; --->0SELECT 'a' REGEXP 'a|b'; --->1 匹配a或bSELECT 'b' REGEXP 'a|b'; --->1 SELECT 'b' REGEXP '^(a|b)'; --->1 SELECT 'a' REGEXP '^(a|b)'; --->1 ELECT 'c' REGEXP '^(a|b)'; --->0 ^符合只有在[]內才是取反的意思,在別的地方都是表示開始處匹配 a{m} 匹配m個a SELECT 'auuuuc' REGEXP 'au{4}c'; ---> 1 SELECT 'auuuuc' REGEXP 'au{3}c'; --->0a{m,} 匹配m個或者更多個a SELECT 'auuuuc' REGEXP 'au{3,}c'; --->1 SELECT 'auuuuc' REGEXP 'au{4,}c'; ---> 1 SELECT 'auuuuc' REGEXP 'au{5,}c'; ---> 0 a{m,n} 匹配m到n個a,包含m和n SELECT 'auuuuc' REGEXP 'au{3,5}c'; --->1 SELECT 'auuuuc' REGEXP 'au{4,5}c';--->1 SELECT 'auuuuc' REGEXP 'au{5,10}c'; --->0 (abc) 將abc作為一個序列匹配,不用括號括起來都是用單個字符去匹配,如果要把多個字符作為一個整體去匹配就需要用到括號,所以括號適合上面的所有情況。SELECT 'xababy' REGEXP 'x(abab)y'; ---> 1 SELECT 'xababy' REGEXP 'x(ab)*y'; ---> 1 SELECT 'xababy' REGEXP 'x(ab){1,2}y'; --->1舉例3
b.capacity_name IN ( "初級經銷商","區級代理商","中級經銷商", "市級代理商", "省級代理商", "高級經銷商", "特約經銷商" ) ; b.`capacity_name` REGEXP '^(初級|區級|特約|高級|中級|市級|省級)(經銷商|代理商)$'; b.capacity_name REGEXP '^.{2,}(經銷商|代理商)$'; 以任意字符開頭且大于等于2個,同時以經銷商或者代理商結尾LIKE
在LIKE匹配時,%表示匹配任意多個字符,_表示匹配單個字符,如果要匹配%或_本身,則要對其進行轉義,\%匹配字符%, \匹配字符。
'abcd' like 'ab%' -- true 'abcd' like 'ab_' -- false 'ab_cde' like 'ab\\_c%'; -- true轉義符
系統采用反斜線\作為轉義符,因此正則表達式的模式中出現的\都要進行二次轉義
其中+是正則中的一個特殊字符,因此要用轉義的方式表達,在正則引擎中的表達方式是a\+b。由于系統還要解釋一層轉義,因此能夠匹配該字符串的表達式是a\+b
Reference:
https://www.cnblogs.com/aaronthon/p/8479841.html
https://help.aliyun.com/document_detail/27871.html?spm=a2c4g.11186623.4.1.20b119bc6z0b7d
總結
以上是生活随笔為你收集整理的odps sql 常用正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Google Code上发布了项目VB
- 下一篇: Fiddler Everywhere配置