mysql-用正则表达式进行搜索
正則表達(dá)式的作用是匹配文本,將一個(gè)模式(正則表達(dá)式)與一個(gè)文本串進(jìn)行比較,mysql允許你指定正則表達(dá)式,過(guò)濾select檢索出的數(shù)據(jù)。但是mysql僅僅支持正則表達(dá)式的一個(gè)子集。
1、基本字符匹配:
select prod_name from products where prod_name regexp '1000' order by prod_name;
以上語(yǔ)句檢索到prod_name包含文本1000的所有行。在regexp后面所跟的東西作為正則表達(dá)式處理。但是正則的好處還有,如下:
select prod_name from products where prod_name regexp '.000' order by prod_name;
這里的.000表示匹配任意一個(gè)字符,當(dāng)然1000和2000都匹配且返回。
like 和 regexp的區(qū)別:like匹配整個(gè)列,如果匹配的文本在列值中出現(xiàn),mysql將不會(huì)找到它。而regexp在列值類進(jìn)行匹配,如果被匹配的文本在列值中出現(xiàn),regexp將會(huì)找到它。但是regexp能否用來(lái)匹配整個(gè)列值,我們使用和$定位符即可。
?
2、進(jìn)行or匹配
為搜索兩個(gè)串(或者為這兩個(gè)串,或者為另一個(gè)串),使用|,如下:
select prod_name from products where prod_name regexp ‘1000|2000’ order by prod_name;
類似where匹配中的OR子句。可以將多個(gè)or條件并入一個(gè)正則表達(dá)式。
3、匹配幾個(gè)字符之一:
如果你只想匹配特定字符,可通過(guò)制定一組用[和]括起來(lái)的字符來(lái)完成,如下:
select prod_name from products where prod_name regexp '[12]ton' order by prod_name
上述語(yǔ)句的意思是匹配1或2,因此1ton和2ton都匹配且返回。其中[12]等效于[1|2]。但是如下:
select prod_name from products where prod_name regexp '1|2|3ton' order by prod_name;
以上語(yǔ)句的結(jié)果是錯(cuò)誤的,因?yàn)槟阕宮ysql檢索的是1或2或3ton,所以他的結(jié)果是錯(cuò)誤的。所以需要用[]括起來(lái)再與其他進(jìn)行連接起來(lái)匹配。
也可以使用[^12],匹配除這些字符外的任何東西。
?
4、匹配范圍:集合可用來(lái)定義要匹配的一個(gè)或多個(gè)字符,如下:[0123456789]
以上語(yǔ)句的等效語(yǔ)句是[0-9],我們可使用-來(lái)定義范圍,范圍不限于完整的結(jié)合,如[1-3][6-9]也是合法的范圍,范圍也不一定只是數(shù)值的,[a-z]匹配任意字母字符。
select prod_name from products where prod_name regexp '[1-5]ton' order by prod_name;
以上主要匹配1-5的數(shù)據(jù)。
5、匹配特殊字符:如果你需要特殊匹配出現(xiàn)在正則表達(dá)式中的這些特殊字符怎么辦?如下我們想匹配.這個(gè)字符。
select vend_name from vendors where vend_name regexp '\\.' order by vend_name;
這里使用了轉(zhuǎn)義,正則中一些具有特殊含義的字符均可以使用其進(jìn)行轉(zhuǎn)義。包括.、|、[]等,\\也可以用來(lái)引用元字符(具有特殊含義的字符),如下:
\\f? ? ? ? ? ?? 換頁(yè)
\\n 換行
\\r 回車(chē)
\\t 制表
\\v 縱向制表
但是如果我們?yōu)榱似ヅ鋅,我們需要使用\\
?
6、匹配字符類:我們還可以使用你自己經(jīng)常使用的數(shù)字、所有字母或所有數(shù)字字母字符等的匹配。我們可以使用預(yù)定義字符集,成為字符類,如下:
select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;
[:alnum:]? ?任意字母和數(shù)字? (a-z A-Z? 0-9)
['alpha:]? ? ?任意字符(a-z A-Z)
[:blank:]? ? ?空格和制表[\\t]
[:cntrl:]? ? ? ?ASCII控制字符[ascii 0-31和127]
[:digit:]? ? ? ?任意數(shù)字[0-9]
?
7、匹配多個(gè)實(shí)例:我們之前使用的正則表達(dá)式都試圖匹配單詞出現(xiàn),如果存在一個(gè)匹配,該行被檢索出來(lái),如果不存在,檢索不出任何行。但是,例如,如果我們需要尋找所有的數(shù),不管數(shù)中包含多少數(shù)字,或者你可能想尋找一個(gè)單詞并且還能夠適應(yīng)一個(gè)未遂的s、
select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)' order by prod_name;
以上語(yǔ)句的正則表達(dá)的含義是匹配在括號(hào)內(nèi)的0-9之間的sticks,可以有s,也可以沒(méi)有s,這是根據(jù)?的解釋
* 0個(gè)或多個(gè)匹配
+ ? ? 1個(gè)或多個(gè)匹配
? ? 0個(gè)或1個(gè)匹配
{n}? ? ? ? ? ? ? ? ? ?指定數(shù)目的匹配
{n,}? ? ? ? ? ? ? ? 不少于指定數(shù)目的匹配
{n,m}? ? ? ? ? ? ? ?匹配數(shù)目的范圍
select prod_name form products where prod_name regexp '[[:digit:]]{4}' order by prod_name;
以上語(yǔ)句匹配的是匹配連在一起的是個(gè)數(shù)字
8、定位符:之前都是匹配一個(gè)串中任意位置的文本,為了匹配特定位置的文本,需要如下的定位符。
例如,你想找出一個(gè)數(shù)(包括以小數(shù)點(diǎn)開(kāi)始的數(shù))開(kāi)始的所有產(chǎn)品,我們只能使用定位符。如下:
select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;
以上語(yǔ)句表達(dá)的是只在.或者任意數(shù)字為串中第一個(gè)字符時(shí)才匹配。
^文本開(kāi)始
$文本結(jié)尾
[[:<:]]? 詞的開(kāi)始
[[:>:]]? 詞的結(jié)尾
轉(zhuǎn)載于:https://www.cnblogs.com/television/p/8343257.html
總結(jié)
以上是生活随笔為你收集整理的mysql-用正则表达式进行搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 竞品分析报告模板
- 下一篇: ROS与navigation教程——概述