6/7 SELECT语句:过滤(正则表达式REGEXP)
| 1 | REGEXP(正則表達(dá)式) | LIKE替換成REGEXP |
| 2 | 匹配任意1個字符 | 元字符:. |
| 3 | OR匹配 | | |
| 4 | 匹配幾個字符之一 | [a|b] |
| 5 | 匹配除指定字符外的字符 | [^a|b] |
| 6 | 匹配范圍 | [a-b] |
| 7 | 匹配特殊字符 | 以\\為前導(dǎo) |
| 8 | 引用元字符 | 以\\為前導(dǎo) |
| 9 | 匹配字符類 | [:alnum:]、[:xdigit:]、[:alpha:]、[:upper:]等 |
| 10 | 匹配多個實例 | 重復(fù)元字符總結(jié) |
| 11 | 匹配特定位置 | 定位元字符總結(jié) |
| 12 | LIKE與REGEXP | 二者差別 |
| 13 | 匹配區(qū)分大小寫 | REGEXP BINARY |
以下為數(shù)據(jù)庫SQLTEST中的三張表,其結(jié)構(gòu)和內(nèi)容如下:
1.REGEXP(正則表達(dá)式)
# 刪除表記錄 mysql> DELETE-> FROM t_stu_profile-> WHERE Stu_id IN (7,8,9); # 插入表記錄 mysql> INSERT t_stu_profile VALUES-> (7, 'a1000', 'F', 20, '0614'),-> (8, 'a2000', 'M', 21, '0611');LIKE替換成REGEXP;
LIKE與REGEXP:
2.匹配任意1個字符
.表示匹配任意1個字符
mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP 'a.000'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 7 | a1000 | F | 20 | 0614 | | 8 | a2000 | M | 21 | 0611 | +--------+----------+--------+------+----------+3.OR匹配
為搜素兩個串之一,使用|;
兩個以上的OR條件:'郭東|王五|張北'。
4.匹配幾個字符之一
[]是另一種形式的OR語句。事實上,正則表達(dá)式[123]Ton為[1|2|3]Ton的縮寫。
mysql> SELECT *-> FROM t_stu_profile-> WHERE Class_id REGEXP '061[1|2|3]'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 1 | 郭東 | F | 16 | 0611 | | 2 | 李西 | M | 18 | 0612 | | 3 | 張北 | F | 16 | 0613 | | 4 | 錢南 | M | 17 | 0611 | +--------+----------+--------+------+----------+5.匹配除指定字符外的字符
字符集合也可以被否定,即,它們將匹配除指定字符外的任何東西。為否定一個字符集,在集合的開始處放置一個^即可。
mysql> SELECT *-> FROM t_stu_profile-> WHERE Class_id REGEXP '061[^4|5]'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 1 | 郭東 | F | 16 | 0611 | | 2 | 李西 | M | 18 | 0612 | | 3 | 張北 | F | 16 | 0613 | | 4 | 錢南 | M | 17 | 0611 | +--------+----------+--------+------+----------+6.匹配范圍
集合可用來定義要匹配的一個或多個字符。如,[0123456789]等同于[0-9]。
mysql> SELECT *-> FROM t_stu_profile-> WHERE Class_id REGEXP '061[1-3]'-> ORDER BY Age DESC; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 2 | 李西 | M | 18 | 0612 | | 4 | 錢南 | M | 17 | 0611 | | 1 | 郭東 | F | 16 | 0611 | | 3 | 張北 | F | 16 | 0613 | +--------+----------+--------+------+----------+7.匹配特殊字符
為了匹配特殊字符,必須用\\為前導(dǎo)。\\-表示查找-,\\.表示查找.;
為了匹配反斜杠字符\本身,需要使用\\\。
8.引用元字符
元字符:具有特殊含義的字符。
| \\f | 換頁 |
| \\n | 換行 |
| \\r | 回車 |
| \\t | 制表 |
| \\v | 縱向制表 |
9.匹配字符類
為更方便工作,可以使用預(yù)定義的字符集,稱為字符類。
| [:alnum:] | 任意字母和數(shù)字 | [a-zA-Z0-9] |
| [:xdigit:] | 任意十六制數(shù)字 | [a-fA-F0-9] |
| [:alpha:] | 任意字符 | [a-zA-Z] |
| [:upper:] | 任意大寫字母 | [A-Z] |
| [:lower:] | 任意小寫字母 | [a-z] |
| [:digit:] | 任意數(shù)字 | [0-9] |
| [:contrl:] | ASCII控制字符 | ASCII 0到31和127 |
| [:punct:] | 既不在[:alnum:]又不在[:contrl:]中的任意字符 | |
| [:blank:] | 空格和制表 | [\\t] |
| [:space:] | 包括空格在內(nèi)的任意空白字符 | [\\f\\n\\r\\t\\v] |
| [:print:] | 任意可打印字符 | |
| [:graph:] | 與[:print:]相同,但不包括空格 |
10.匹配多個實例
目前為止使用的所有正則表達(dá)式都試圖匹配單次出現(xiàn),但有時需要對匹配的數(shù)目進行更強的控制。
| . | 任意1個字符匹配 | |
| * | 0個或多個匹配 | |
| + | 1個或多個匹配 | {1,} |
| ? | 0個或1個字符 | {0,1} |
| {n} | 指定數(shù)目的匹配 | |
| {n,} | 不少于指定數(shù)目的匹配 | |
| {n,m} | 匹配數(shù)目的范圍(m不超過255) |
\\(是對(的轉(zhuǎn)義;[0-9]匹配任意數(shù)字;tests?匹配test和tests,?匹配它前面的任何字符的0次或1次;\\)是對)的轉(zhuǎn)義。
# 刪除行:Stu_Name=.1 mysql> DELETE-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '[//.].'; mysql> INSERT t_stu_profile-> VALUES-> (7, '(1 test)', 'F', 15, '0612'),-> (8, '(2 tests)', 'M', 16, '0615'); mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '\\([0-9] tests?\\)'; +--------+-----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+-----------+--------+------+----------+ | 7 | (1 test) | F | 15 | 0612 | | 8 | (2 tests) | M | 16 | 0615 | +--------+-----------+--------+------+----------+ mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '[\\(][1,2] tests?[\\)]'-> ORDER BY Class_id DESC,Age DESC; +--------+-----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+-----------+--------+------+----------+ | 8 | (2 tests) | M | 16 | 0615 | | 7 | (1 test) | F | 15 | 0612 | +--------+-----------+--------+------+----------+匹配連在一起的5個字符;
[:alpha:]匹配任意字符,{4}要求它前面的字符出現(xiàn)4次,所以[:alpha:]{4}匹配連在一起的任意4位字符,同[a-z][a-z][a-z][a-z]。
11.匹配特定位置
目前為止的所有例子都是匹配一個串中任意位置的文本。為了匹配特定位置的文本,需要使用定位元字符。
| ^ | 文本的開始 |
| $ | 文本的結(jié)尾 |
| [[:<:]] | 詞的開始 |
| [[:>:]] | 詞的結(jié)尾 |
找一個以小數(shù)點或小寫字母開頭的Stu_Name。
mysql> DELETE-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '[:alnum:]{4}'; mysql> INSERT t_stu_profile-> VALUES-> (7, '.test', 'F', 15, '0611');-> (8, 'test', 'M', 15, '0612'); mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '^[\\.[:lower:]]'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 7 | .test | F | 15 | 0611 | | 8 | test | M | 15 | 0612 | +--------+----------+--------+------+----------+^的雙重用途:①在集合([])中用來否定該集合;②用來指串的開始處。
簡單的正則表達(dá)式測試:可以用帶文字串的REGEXP來測試表達(dá)式,并試驗它們,相應(yīng)的語法如下:SELECT 'hello' REGEXP '[0-9]'。
12.LIKE與REGEXP
LIKE與REGEXP的差別:LIKE匹配整個列,如果被匹配的文本在列值中出現(xiàn),LIKE將不會找到它;而REGEXP在列值內(nèi)進行匹配,如果被匹配的文本在列值中出現(xiàn),REGEXP將會找到它。
使REGEXP起類似LIKE的作用:LIKE匹配整個串而REGEXP匹配子串。利用定位符,通過用^開始每個表達(dá)式,用$結(jié)束每個表達(dá)式,可以使REGEXP的作用與LIKE一樣。
mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name LIKE '1000'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 9 | 1000 | F | 14 | 0613 | +--------+----------+--------+------+----------+mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP '1000'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 7 | a1000 | F | 20 | 0614 | | 9 | 1000 | F | 14 | 0613 | +--------+----------+--------+------+----------+13.匹配區(qū)分大小寫
MySQL中的正則表達(dá)式匹配不區(qū)分大小寫,為區(qū)分大小寫,可使用BINARY關(guān)鍵字。
mysql> INSERT t_stu_profile-> VALUES (10, 'A1000', 'F', 22, '0612'); mysql> SELECT *-> FROM t_stu_profile-> WHERE Stu_Name REGEXP BINARY 'A1000'; +--------+----------+--------+------+----------+ | Stu_id | Stu_Name | Gender | Age | Class_id | +--------+----------+--------+------+----------+ | 10 | A1000 | F | 22 | 0612 | +--------+----------+--------+------+----------+總結(jié)
以上是生活随笔為你收集整理的6/7 SELECT语句:过滤(正则表达式REGEXP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5/7 SELECT语句:过滤(LIKE
- 下一篇: 7/7 SELECT语句:创建计算字段