SQL 正则表达式
一、正則表達式
- like與regexp的區別[1]
- like匹配整個列[2]。如果被匹配的文本僅在列值中出現,LIKE并不會找到它,相應的行也不會返回(當然,使用通配符除外);
- REGEXP在列值內進行匹配。如果被匹配的匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回,這時一個非常重要的差別(當然,如果適應定位符號^和$,可以實現REGEXP匹配整個列而不是列的子集)
區分大小寫:MySQL中正則表達式匹配(從版本3.23.4后)不區分大小寫 。如果要區分大小寫,應該使用BINARY關鍵字,如where post_name REGEXP BINARY 'Hello .000'
二、like
通配符:%任意字符,_單個字符
##查找名字中有“騰”顧客 select name from user_id where name like '%騰%'##查找名字的姓為“張”的顧客 select name from user_id where name like '張%'##查找名字的最后一個字為“峰”的顧客 select name from user_id where name like '%峰'三、regexp
所使用的模式表如下:
| ^ | 匹配字符串開頭 | select name from 表名 where name regexp '^王' | 匹配姓為王的名字 |
| $ | 匹配字符串結尾 | select name from 表名 where name regexp '明$' | 匹配名字最后一個字為明的名字 |
| . | 匹配任意字符 | select name from 表名 where name regexp '.明.' | 匹配帶有明的名字 |
| […] | 匹配方括號間列出的任意字符 | select name from 表名 where name regexp '^[wzs]'; | 匹配括號里任意字符的名字 |
| [^…] | 匹配方括號間未列出的任意字符 | select name from 表名 where name regexp '^[^wzs]'; | 匹配未在括號里任意字符的名字 |
| p1|p2|p2 | 交替:匹配任意p1或p2或p3 | select performance from 表名 where performance regexp 'A-|A|A+'; | 匹配p1,p2,p3 |
| * | 匹配前面的字符零次或者多次 | str*' | 可以匹配st/str/strr/strrr…… |
| ? | 匹配前面的字符零次或者1次 | str?' | 可以匹配st/str |
| + | 匹配前面的字符一次或者多次 | str+' | 可以匹配str/strr/strrr/strrrr…… |
| {n} | 匹配前面的字符n次 | ||
| {m,n} | 匹配前面的字符m至n次 |
例子:
## 查詢所有以 'st' 開頭的name SELECT name FROM user WHERE name REGEXP'^st'## 查詢所有以 'ok' 結尾的 name SELECT name FROM user WHERE name REGEXP 'ok$'查詢所有包含 'mar' 的 name SELECT name FROM user WHERE name REGEXP 'mar'四、not regexp: 是MySQL用于模式匹配的操作符。它比較列中的給定模式,并返回與模式不匹配的列。查找在匹配中沒有的數據
##查找開頭不是姓張的 select * from user where name not regexp '^張'##查找不含有英文字母的其他的名字 select from user where not regexp '[a-zA-Z]'五、regexp_instr()函數
regexp_instr()函數返回與正則表達式模式匹配的子字符串的起始索引
REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
| exp | 源字符串 |
| pat | 正則表達式 |
| pos | 可選參數,標識開始匹配的位置,默認為 1 |
| occurrence | 可選參數,標識匹配的次數,默認為 1 |
| return_option | 可選參數,指定返回值的類型。如果為 0,則返回匹配的第一個字符的位置。如果為 1,則返回匹配的最后一個位置,默認為 0 |
| match_type | 可選參數,允許優化正則表達式。例如,可以使用此參數指定是否區分大小寫 |
六、regexp_like()
函數用于模式匹配。它比較給定的字符串,如果字符串相同則返回,如果為真返回1,否則返回0
##形式select regexp_like(str1, str2)select regexp_like('MCA', 'mca')result result=1 不區分大小寫 select regexp_like('MCA', 'bcd')result result=0七、regexp_replace()函數
用于模式匹配。它通過匹配字符來替換給定的字符串。
regexp_replace(str,'舊字符串,新字符串) ##替換 select ('zhangsan','san','si')result result=zhangsiselect ('Java','Java','Mysql')result result=Mysql八、regexp_substr()函
數用于模式匹配。它從給定的字符串中返回子串
##語法 select regexp_substr('str', 'match_type', occurrence, position, )select REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1) result1, ##.表示任意字符 REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2) result2, REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 6) result3 返回:result1=catresult2=cityresult3=cute7、其他
a.匹配特殊的字符需要使用\轉義字
| \\. | 能夠匹配. |
| \\f | 換頁 |
| \\n | 換行 |
| \\r | 回車 |
| \\t | 制表 |
| \\ | 縱向制表 |
注意:為了匹配\本身,需要使用\\\
b.匹配字符類
- [:alnum:] 任意字母和數字(通[a-zA-Z0-9])
- [:alpha:] 任意字符(同[a-zA-Z])
- [:blank:] 空格和制表符(同[\\t])
- [:digit:] 任意數字(同[0-9])
- [:lower:] 任意小寫字母
- [:upper:] 任意大寫字母
- [:space:] 包括空格在內的任意空白字符
c.匹配多個實例,關于重復元字符
- * 0個或者多個匹配
- + 1個或者多個匹配(等于{1,})
- ? 1個或者多個匹配(等于{0,1})
- {n} 指定數目的匹配
- {n,} 不少于指定數目的匹配
- {n,m} 匹配數目的范圍(m不超過255)
d.定位符
- ^ 文本的開始
- & 文本的結尾
- [[:<:]] 詞的開始
- [[:>:]] 詞的結尾
- 通過使用這些定位符,能夠使REGEXP起類似LIKE的作
總結
- 上一篇: Hadoop中各组件的作用
- 下一篇: 长沙开发者技术大会暨.NET技术社区成立