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