安徽思成儀器技術(shù)有限公司
暫無(wú)信息 |
經(jīng)營(yíng)模式:代理商
商鋪產(chǎn)品:168條
所在地區(qū):安徽合肥市
聯(lián)系人:余宗濤 (銷(xiāo)售經(jīng)理)
閱讀:16發(fā)布時(shí)間:2024-11-23
MySQL正則表達(dá)式匹配查詢(xún) 一、正則表達(dá)式介紹
? 在過(guò)濾的時(shí)候允許使用匹配、比較和通配符尋找數(shù)據(jù)。對(duì)于基本的過(guò)濾,這些可能就足夠了。但是隨著過(guò)濾條件復(fù)雜性的增加,where子句本身的復(fù)雜性也有必要增加。
? 這里簡(jiǎn)單介紹一下使用正則表達(dá)式匹配搜索。所有種類(lèi)的程序設(shè)計(jì)語(yǔ)言、文本編輯器、操作系統(tǒng)都支持正則表達(dá)式。很多程序員都將正則表達(dá)式作為自己的技能。熟練使用正則表達(dá)式,可以幫助我們減少很多的麻煩。
? 正則表達(dá)式用正則表達(dá)式語(yǔ)言來(lái)建立,正則表達(dá)式語(yǔ)言是用來(lái)完成過(guò)濾、匹配類(lèi)工作的一種特殊語(yǔ)言。與其他語(yǔ)言一樣,它用于自己的特殊的語(yǔ)法和指令。
二、使用正則表達(dá)式
? 正則表達(dá)式的作用是匹配文本,將一個(gè)模式與一個(gè)文本串進(jìn)行比較,根據(jù)自定義的模式,過(guò)濾出你需要的數(shù)據(jù)。MySQL的正則表達(dá)式只是正則表達(dá)式的一個(gè)子集。
測(cè)試數(shù)據(jù)
mysql> select * from regexp_test;+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 |+------+----------+7 rows in set (0.00 sec)
1.基本字符匹配
使用like匹配name為xiao的用戶(hù),需要借助通配符%
mysql> select * from regexp_test where name like 'xiao%';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua |+------+----------+3 rows in set (0.01 sec)mysql> explain select * from regexp_test where name like 'xiao%';
使用regexp匹配name為xiao的用戶(hù),無(wú)需借助任何通配符
regexp在列值內(nèi)進(jìn)行匹配,如果被匹配的文本在列值中出現(xiàn),regexp將會(huì)找到他,相應(yīng)的行將被返回。
regexp正則表達(dá)式匹配不區(qū)分大小寫(xiě)
mysql> select * from regexp_test where name regexp 'xiao';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua |+------+----------+3 rows in set (0.00 sec)
2.OR匹配
使用or匹配多個(gè)符合條件的數(shù)據(jù)
mysql> select * from regexp_test where id = 1 or id = 2;+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong |+------+----------+2 rows in set (0.00 sec)
使用regexp匹配多個(gè)符合條件的數(shù)據(jù)
使用regexp的|功能類(lèi)似于在select中使用or
mysql> select * from regexp_test where id regexp '1|2';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong |+------+----------+2 rows in set (0.00 sec)
3.模糊匹配
使用or模糊匹配
mysql> select * from regexp_test where id = 1 or id = 2 or id = 8;+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong |+------+----------+2 rows in set (0.00 sec)
使用|匹配其中符合條件的
mysql> select * from regexp_test where id regexp '1|2|8';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong |+------+----------+2 rows in set (0.00 sec)
使用[]匹配符合條件
mysql> select * from regexp_test where id regexp '[128]';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong |+------+----------+2 rows in set (0.00 sec)
4.匹配范圍
[123456789]即為匹配到123456789這個(gè)集合
[1-9]即為匹配到123456789這個(gè)集合
[a-z]匹配任意字母
mysql> select * from regexp_test where name regexp '[a-z]';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 |+------+----------+7 rows in set (0.00 sec)mysql> select * from regexp_test where id regexp '[0-9]';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 |+------+----------+7 rows in set (0.00 sec)
5.匹配特殊字符
.和-在正則表達(dá)式中是特殊字符,需要使用兩個(gè)雙引號(hào)//轉(zhuǎn)義,例如//-表示查找-,例如//.表示查找.
原字符說(shuō)明
//f
換頁(yè)
//n
換行
//r
回車(chē)
/
制表
//v
縱向制表
至于為什么要有兩個(gè)反斜杠,MySQL要求需要兩個(gè),一個(gè)是MySQL自身需要,一個(gè)正則表達(dá)式需要
## 模擬插入一條帶.的數(shù)據(jù)mysql> insert into regexp_test values(8,'z.y');## 因?yàn)?匹配任意字符,所以會(huì)把所有數(shù)據(jù)都匹配到mysql> select * from regexp_test where name regexp '.';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 || 8 | z.y |+------+----------+8 rows in set (0.00 sec)## 當(dāng)使用兩個(gè)反斜杠轉(zhuǎn)義后,查詢(xún)出的結(jié)果和我們的期望一致mysql> select * from regexp_test where name regexp '//.';+------+------+| id | name |+------+------+| 8 | z.y |+------+------+1 row in set (0.00 sec)
6. 匹配字符類(lèi)
存在找出經(jīng)常使用使用數(shù)字、所有字母字符或所有數(shù)字字母字符的匹配。為方便使用,可以采取預(yù)定義的字符集,稱(chēng)為字符類(lèi)。
類(lèi)說(shuō)明
[:alnum:]
任意字符和數(shù)字,同[a-zA-Z0-9]
[:alpha:]
任意字符,同[a-zA-Z]
[:blank:]
空格和制表,同[/]
[:cntrl:]
ASCAII控制字符mysql 正則匹配中文,ASCAII 0 到31和127
[:digit:]
任意數(shù)字,同[0-9]
[:graph:]
與[:print:]相同,但不包括空格
[:lower:]
任意小寫(xiě)字母,同[a-z]
[:print:]
任意可打印字符
[:punct:]
既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:]
包括空格在內(nèi)的任意空白字符,同[//f//n//r///v]
[:upper:]
任意大寫(xiě)字母,同[A-Z]
[:xdigit:]
任意十六進(jìn)制數(shù)字,同[a-fA-F0-9]
7.匹配多個(gè)實(shí)例
? 目前為止使用的所有正則表達(dá)式都嘗試匹配單次出現(xiàn)。如果存在一個(gè)匹配,該行被檢索出來(lái),如果不存在mysql 正則匹配中文,檢索不出任何行。但有時(shí)需要對(duì)匹配的數(shù)目進(jìn)行更強(qiáng)的控制。例如,你可能需要尋找所有的數(shù),不管數(shù)中包含多少數(shù)字,或者你可能想尋找一個(gè)單詞并且能夠適應(yīng)一個(gè)跟隨的字符,等。
元字符說(shuō)明
*
0個(gè)或多個(gè)匹配
+
1個(gè)或多個(gè)匹配
?
?匹配它前面的任何字符的0次活1次出現(xiàn)
{n}
數(shù)目的匹配
{n,}
不少于數(shù)目的匹配
{n,m}
匹配數(shù)目的范圍(m不超過(guò)255)
例一:匹配到滿(mǎn)足xiaoh和xiao的數(shù)據(jù)
mysql> select * from regexp_test where name regexp 'xiaoh?';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua |+------+----------+3 rows in set (0.01 sec)
例二 :仔細(xì)觀察{4}和{1}匹配到數(shù)據(jù)的不同點(diǎn)
## 匹配4個(gè)連續(xù)小寫(xiě)字母mysql> select * from regexp_test where name regexp '[a-z]{4}';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 |+------+----------+7 rows in set (0.00 sec)## 匹配1個(gè)連續(xù)小寫(xiě)字母mysql> select * from regexp_test where name regexp '[a-z]{1}';+------+----------+| id | name |+------+----------+| 1 | xiaoming || 2 | xiaohong || 3 | xiaohua || 4 | zhangsan || 5 | lisi || 6 | liwu || 7 | liliu9 || 8 | z.y |+------+----------+8 rows in set (0.00 sec)
8.定位符
? 以上介紹中都是匹配到一個(gè)字符串中任意位置的文本。為了匹配特定位置的文本,可以參考使用定位符:
元字符說(shuō)明
^
文本開(kāi)始
$
文本結(jié)尾
[[::]]
詞的結(jié)尾
notes:特別需要注意的是,當(dāng)在`[]`內(nèi)的時(shí)候代表的是否定該集合,當(dāng)在[]外的時(shí)候代表的是文本開(kāi)始
案例一:匹配以數(shù)字結(jié)尾
mysql> select * from regexp_test where name regexp '[a-z][0-9]$';+------+--------+| id | name |+------+--------+| 7 | liliu9 |+------+--------+1 row in set (0.01 sec)
案例二:匹配以數(shù)字開(kāi)頭
mysql> select * from regexp_test where name regexp '^[0-9][a-z]';+------+-------+| id | name |+------+-------+| 9 | 1zbc || 10 | 1qwr2 |+------+-------+2 rows in set (0.00 sec)
案例三:匹配以數(shù)字開(kāi)頭,以數(shù)字結(jié)尾
mysql> select * from regexp_test where name regexp '^[0-9][a-z]*[0-9]$';+------+-------+| id | name |+------+-------+| 10 | 1qwr2 |+------+-------+1 row in set (0.00 sec)
儀表網(wǎng) 設(shè)計(jì)制作,未經(jīng)允許翻錄必究 .? ? ?
請(qǐng)輸入賬號(hào)
請(qǐng)輸入密碼
請(qǐng)輸驗(yàn)證碼
請(qǐng)輸入你感興趣的產(chǎn)品
請(qǐng)簡(jiǎn)單描述您的需求
請(qǐng)選擇省份