mysql正则表达式简单
正則表達式是用某種模式去匹配某個字符串的一個方式。mysql使用正則表達式的基本形式如下:
屬性名 regexp '匹配方式';當然,上述語句的前面一般是一個select 語句。以下例子以下面兩個表為例.
mysql> select * from department; +------+-----------+--------------+-------------+ | d_id | d_name | function_ | address | +------+-----------+--------------+-------------+ | 1001 | 科研部 | 研發產品 | 3號樓5層 | | 1002 | 生產部 | 生產產品 | 5號樓1層 | | 1003 | 銷售部 | 策劃銷售 | 5號樓1層 | +------+-----------+--------------+-------------+ 3 rows in set (0.00 sec)mysql> select * from employee; +-----+------+-----------+------+------+-----------------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | | 4 | 1004 | Aric | 15 | 男 | England | | 5 | 1005 | John | 54 | 男 | gongzhufen of haidian strict of beijing | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------------+ 6 rows in set (0.00 sec)1.匹配字符串的開始部分,模式 '^'.? (模式,就是匹配方式)
查詢department表中字段address以3開頭的記錄,如下:
mysql> select * from department where address-> regexp '^3'; +------+-----------+--------------+-------------+ | d_id | d_name | function_ | address | +------+-----------+--------------+-------------+ | 1001 | 科研部 | 研發產品 | 3號樓5層 | +------+-----------+--------------+-------------+ 1 row in set (0.00 sec)查詢department表中address字段以2開頭的字段,如下:
mysql> select * from department where address regexp '^2'; Empty set (0.00 sec)查詢employee表中homeaddr字段以北京市開頭的字段,如下:
mysql> select * from employee where homeaddr -> regexp '^北京市'; +-----+------+--------+------+------+--------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+--------+------+------+--------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | +-----+------+--------+------+------+--------------------+ 2 rows in set (0.00 sec)注意:不輪匹配什么樣類型的字段,必須有'^? ?'
例如,查詢employee中age字段以5開頭的記錄,如下:
mysql> select * from employee where -> age regexp '^5'; +-----+------+------+------+------+-----------------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+------+------+------+-----------------------------------------+ | 5 | 1005 | John | 54 | 男 | gongzhufen of haidian strict of beijing | +-----+------+------+------+------+-----------------------------------------+ 1 row in set (0.00 sec)2.匹配字符串的結尾部分,利用匹配方式:'匹配字符串$'
查詢department表中function_字段以產品結尾的字段,如下:
mysql> select * from department -> where function_ regexp '產品$'; +------+-----------+--------------+-------------+ | d_id | d_name | function_ | address | +------+-----------+--------------+-------------+ | 1001 | 科研部 | 研發產品 | 3號樓5層 | | 1002 | 生產部 | 生產產品 | 5號樓1層 | +------+-----------+--------------+-------------+ 2 rows in set (0.00 sec)注意查詢自負在$自負前面,和前面匹配字段前面部分是相反的。
查詢department的d_id字段以6結尾的記錄:
mysql> select * from department-> where d_id regexp '6$'; Empty set (0.00 sec)3.? ? 英文句號.能匹字符串中任意一個字符,包括回車和換行
查找department表中d_id字段,類似1..3的記錄(開頭和結尾分別是1和3,中間2位任意),如下:
mysql> select * from department where d_id -> regexp '^1..3$'; +------+-----------+--------------+-------------+ | d_id | d_name | function_ | address | +------+-----------+--------------+-------------+ | 1003 | 銷售部 | 策劃銷售 | 5號樓1層 | +------+-----------+--------------+-------------+ 1 row in set (0.00 sec)查詢employee表中,name字段中以'趙'開頭,'才'結尾的記錄,中間還有一個字可以任意,如下:
mysql> select * from employee where name-> regexp '^趙.才$'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 1 row in set (0.01 sec)可以看出,在匹配中,英文句號.可以匹配任何一個符號。
4.匹配字符集中任意一個字符
查找employee中homeaddr字段中,含有'北上廣'三個字符中任何一個字符的記錄,如下:
mysql> select * from employee where -> homeaddr regexp '[北上廣]'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 3 rows in set (0.00 sec)在department表中查詢字段d_name中含有'研產策'三個字符中任何一個字符的記錄,如下:
mysql> select * from department where d_name regexp '[研產策]'; +------+-----------+--------------+-------------+ | d_id | d_name | function_ | address | +------+-----------+--------------+-------------+ | 1001 | 科研部 | 研發產品 | 3號樓5層 | | 1002 | 生產部 | 生產產品 | 5號樓1層 | +------+-----------+--------------+-------------+ 2 rows in set (0.00 sec)查找department表中d_id字段中有字母的記錄,如下:
mysql> select * from department where d_id -> regexp '[a-z]'; Empty set (0.00 sec)[]可以指定集合區間,中間用-連接即可.
5.匹配除了字符集中任何一個字符(比如說,不是’張三‘,那么李四就可以。)
在表employee中的name字段匹配a-r以外的字符,如下:
mysql> select * from employee where name regexp '[^a-r]'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 4 rows in set (0.00 sec)在表employee中的name字段匹配a-r,張王李? ?以外的字符,如下:
mysql> select * from employee where-> name regexp '[^a-r張王李]'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 4 rows in set (0.00 sec)注意:只要某個記錄的name中沒有a-r張王李,那么就會被查出來,也就是說,如果想不被查出來,除非這個記錄的name字段每個字符都在? ?a-r張王李? 之中。
6.匹配指定的字符串,字符串之間用 | 連接
查詢employee表中的homeaddr中長沙,如下:
mysql> select * from employee where homeaddr regexp '長沙'; +-----+------+--------+------+------+--------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+--------+------+------+--------------------+ | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | +-----+------+--------+------+------+--------------------+ 1 row in set (0.00 sec)查詢employee表中的homeaddr中長沙或者廣州,如下:
mysql> select * from employee where homeaddr regexp '長沙|廣州'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 2 rows in set (0.00 sec)注意:匹配的字符串中間不要有空格,否則空格也算一個字符。
7.匹配多個該符號之前的字符。比如a*b,就是某個記錄所有的字符b前面是否存在前面有字符a的情況,包括0個。
根據我自己的運行情況,字符a和b都必須是一個字符或者漢字。
查詢employee的homeaddr字段是否多個里前面是否有廣,如下:
mysql> select * from employee where homeaddr regexp '廣*里'; +-----+------+-----------+------+------+-----------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------+ | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------+ 1 row in set (0.00 sec)注意:如果a和b不止一個字符,那么結果是0 set。
8.+和*類似,不過就是至少得1個。例如a+b,多個b前面至少有一個a。
例如,查詢employee表中的字段homeaddr中,多個d前面至少有一個有n。
mysql> select * from employee where homeaddr regexp 'n+d'; +-----+------+------+------+------+----------+ | num | d_id | name | age | sex | homeaddr | +-----+------+------+------+------+----------+ | 4 | 1004 | Aric | 15 | 男 | England | +-----+------+------+------+------+----------+ 1 row in set (0.00 sec)9.使用{M}或者{M,N}指定字符串連續出現的次數。
查詢employee表中的d_id字段,出現連續2個0的,如下:
mysql> select * from employee where -> d_id regexp '0{2}'; +-----+------+-----------+------+------+-----------------------------------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+-----------+------+------+-----------------------------------------+ | 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區 | | 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 | | 3 | 1002 | 王五 | 25 | 男 | 湖南省長沙市 | | 4 | 1004 | Aric | 15 | 男 | England | | 5 | 1005 | John | 54 | 男 | gongzhufen of haidian strict of beijing | | 6 | 1006 | 趙天才 | 40 | 男 | 廣東省廣州市西華里街道 | +-----+------+-----------+------+------+-----------------------------------------+ 6 rows in set (0.01 sec)同上,查詢連續3個的,如下:
mysql> select * from employee where d_id regexp '0{3}'; Empty set (0.00 sec)?
總結
以上是生活随笔為你收集整理的mysql正则表达式简单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xhtml的行内描述性元素
- 下一篇: C 库函数 - atoi()