sql的匹配和正則表達式


1. 匹配:like 關鍵字

#假設存在表 my_test_copy
select * from my_test_copy;

 則使用like關鍵詞匹配:注意下划線 '_'和百分號 '%'

# 下划線'_'匹配任意單個字符
# 百分號'%'匹配任意數目的字符
select * from my_test_copy where name_people like '_滿_'; #有值
select * from my_test_copy where name_people like '%滿%'; #有值,百分號可以匹配任意數目的字符

select * from my_test_copy where name_people like '%樓'; #有值,百分號可以匹配任意數目的字符
select * from my_test_copy where name_people like '_樓'; #為空,因為下划線只能代表一個字符
select * from my_test_copy where name_people like '_滿樓'; #有值

2. 正則表達式:'rlike' 和 'regexp'同義,用於標識正則表達式模式

(1)'rlike' 和 'regexp'

select 'abc' regexp 'ab'; # regexp左操作數是要匹配的字符串,右操作數是匹配模式
select * from my_test_copy where name_people regexp '';
select * from my_test_copy where name_people rlike '';

 

 (2)直接匹配

select 'abc' regexp 'b'; #返回1
select * from my_test_copy where name_people regexp '滿'; #有值

(3)'^'符號,匹配開頭,從字符串開始進行匹配

select * from my_test_copy where name_adress regexp '^天壇'; #為空,用於查詢以....開頭的字符串,而沒有以'天壇'開頭的字符串
select * from my_test_copy where name_adress regexp '^北'; #有值,用於查詢以....開頭的字符串

 

 (4)'$'符號,匹配結尾

select * from my_test_copy where name_adress regexp '北$'; #為空,用於查詢以....結尾的字符串
select * from my_test_copy where name_adress regexp '京$'; #有值

(5)點號 '.' 符號,匹配任意一個字符

select * from my_test_copy where name_adress regexp '北.'; #有值
select * from my_test_copy where name_adress regexp '.京$'; #有值

(6)'+'符號,+前面的模式至少出現1次或以上

select * from my_test_copy where name_adress regexp 'beijing+'; #有值
select * from my_test_copy where name_adress regexp '京+'; #有值

(7)'*'符號,*前面的模式出現0次或以上

select * from my_test_copy where name_adress regexp '北京*'; #有值,''出現,且''接着''出現0次以上
select * from my_test_copy where name_adress regexp '人*'; #有值,出現0次

(8)'?'符號,'?'前面的模式出現0次或1次

select 'abc' regexp '^(ab)?c$'; #有值
select 'aaabc' regexp '^a*b?c$'; #有值
select 'ababc' regexp '^(ab)+c$'; #有值
select * from my_test_copy where name_adress regexp '人?'; #有值,出現0次
select * from my_test_copy where name_adress regexp '京?'; #有值,出現1次
select * from my_test_copy where name_adress regexp '(山庄)?'; #有值,出現0次或1次(山庄)
select * from my_test_copy where name_adress regexp '山庄?'; #有值,出現了''和1次''

(9)'()'符號,表示一個整體

select '33123400' regexp '(34)1'; #返回0:表示沒找到

select 'ac' regexp '^(ab)?c$'; #為0,表示未找到
select 'ababc' regexp '^(ab)?c$'; # 結果為0,'?'表示出現0次或1次 開頭'(ab)',而這個句子中出現了2次'ab',不符合條件,可以寫成 select 'ababc' regexp '^(ab){1,3}c$'; # {1,3}表示(ab)出現的次數在1-3次都可以

(10)'[]'符號,表示對其中的任意一個字符進行匹配,且僅能匹配一個字符

select 'heo' regexp '^h[abcde]o$'; #為1
select 'hello' regexp '^h[abcde]o$'; #為0,,雖然能匹配'e',但是兩個'l'沒有匹配
select 'hello' regexp '^h[abcdehijklmn]o$'; #為0,,雖然能匹配'e''l',但是'[]'每次只能匹配其中一個字符
select * from my_test_copy where name_adress regexp '萬梅[山庄陣]'; #有值,匹配到'萬梅山'

(11)'[]'中可以使用'-'表示區間,表示該區間的任意一個字符,my_test是另一個表

select 'abcde' regexp '^a[a-k]';
select 'abcde' regexp '[a-k]'; #查找是否存在字母
select * from my_test where phone_number regexp '[0-9]'; #有值,匹配到數字
select * from my_test where phone_number regexp '12[a-z]'; #為空

(12)若'[]'需要匹配']',則']'必須緊跟在'['之后

select 'aacc' regexp 'a[]a-z]'; #有值
select 'aa]cc' regexp 'a[]]'; #有值
select 'aa]cc' regexp 'a[bcc]dd]'; #為0,因為']'不是緊跟着'['
select 'aa]cc' regexp 'a[]bcac]'; #為1
select 'aa]cc' regexp 'a[bc]]'; #為0,']'放在末尾也不行

(13)若'[]'需要匹配'-',則'-'需要放在'[]'兩端,放在中間可能會報錯:[Err] 3697 - The regular expression contains an [x-y] character range where x comes after y.

select 'aaa-ccc-ddd' regexp 'a[-]'; #有值
select 'aaa-ccc-ddd' regexp 'a[-cdf]'; #有值,匹配到'a-'
select 'aaa-ccc-ddd' regexp 'a[d-a]'; #[Err] 3697 - The regular expression contains an [x-y] character range where x comes after y.

(14)[^]表示不含'[]'中的任意字符

#例如:不含數字
select 'aaabbb' regexp '[^0-9]'; #為1

select 'aaabbb' regexp '[^0-9]$'; #為1,不以數字結尾
select 'aaabbb233' regexp '[^0-9]$'; #為0

select 'aaabbb' regexp '^[^0-9]'; #為1,不以數字開頭
select '23aaabbb' regexp '^[^0-9]'; #為0

select * from my_test_copy where name_adress regexp '[^北京]'; #表示不能只有'北京'
select * from my_test_copy where name_adress regexp '^[^北]'; #表示開頭不含''
select * from my_test_copy where name_adress regexp '萬梅[^山]'; #表示不含'萬梅山'

(15)'|' 匹配分隔的任意一個字符

select 'abc' regexp 'b|a|c';
select * from my_test_copy where name_adress regexp '北京|南京'; #表示含有'北京''南京'

(16)'{t}' 匹配前面的字符t次

select 'ababc' regexp '^(ab){2}c$'; #為1
select 'ababc' regexp '^ab{2}c$'; #為0,因為'b'沒有出現2次
select 'abbbc' regexp '^ab{3}c$'; #為1

(17)'{t,s}'匹配前面的字符t-s次均可,t<=s

select 'abbbc' regexp '^ab{2,4}c$'; #為1,因為'b'出現3次
select 'abc' regexp '^ab{2,4}c$'; #為0,因為'b'出現1次,不在2-4之間

select 'abbbbbbc' regexp '^ab{1,}c$'; #為1,{1,}缺省,表示出現1次及以上

(18){t,s}中不能出現空格,否則報錯:[Err] 3692 - Incorrect description of a {min,max} interval.

select 'aoe' regexp '^ao{0 , 1}c$'; # [Err] 3692 - Incorrect description of a {min,max} interval.

 

#歡迎交流

參考:

https://www.cnblogs.com/liuwei6/p/7279542.html

https://blog.csdn.net/a1311010193/article/details/101388446

https://www.runoob.com/mysql/mysql-regexp.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM