萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中replace、regexp正則表達式替換用法

mysql中replace、regexp正則表達式替換用法

可能很多朋友在使用replace時只是簡單的替換字符了,replace不但可以替換字符還可以直接在裡面使用正則表達式來替換了,下面我們一起來看看具體一些關於replace正則替換字符的用法吧。

mysql字段值替換具體做法如下:

 代碼如下 復制代碼

update `table_hospital` set service=replace(service,"<a%</font></a>",'')
<br type="_moz">

可以限制ID,范圍,具體內容自己發揮想象!


mysql數據庫中replace、regexp的用法,主要是通過sql語句實現數據的替換。

mysql replace用法
1.replace into

 代碼如下 復制代碼 replace into table (id,name) values('1′,'aa'),('2′,'bb')

此語句的作用是向表table中插入兩條記錄。如果主鍵id為1或2不存在
就相當於

 代碼如下 復制代碼 insert into table (id,name) values('1′,'aa'),('2′,'bb')

如果存在相同的值則不會插入數據


2.replace(object,search,replace)
把object中出現search的全部替換為replace

 代碼如下 復制代碼 select replace('www.111cn.net','w','Ww')—>WwWwWw.111cn.net
例:把表table中的name字段中的aa替換為bb
update table set name=replace(name,'aa','bb')


由MySQL提供的模式匹配的其它類型是使用擴展正則表達式。當你對這類模式進行匹配測試時,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。
擴展正則表達式的一些字符是:

· ‘.'匹配任何單個的字符。
· 字符類“[...]”匹配在方括號內的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。為了命名字符的范圍,使用一個“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何數字。
· “ * ”匹配零個或多個在它前面的字符。例如,“x*”匹配任何數量的“x”字符,“[0-9]*”匹配任何數量的數字,而“.*”匹配任何數量的任何字符。

如果REGEXP模式與被測試值的任何地方匹配,模式就匹配(這不同於LIKE模式匹配,只有與整個值匹配,模式才匹配)。
為了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用“^”或在模式的結尾用“$”。
為了說明擴展正則表達式如何工作,下面使用REGEXP重寫上面所示的LIKE查詢:
為了找出以“b”開頭的名字,使用“^”匹配名字的開始:

 代碼如下 復制代碼 mysql> SELECT * FROM pet WHERE name REGEXP ‘^b';
+——–+——–+———+——+————+————+
| name| owner | species | sex | birth | death |
+——–+——–+———+——+————+————+
| Buffy | Harold | dog| f | 1989-05-13 | NULL|
| Bowser | Diane | dog| m | 1989-08-31 | 1995-07-29 |
+——–+——–+———+——+————+————+

如果你想強制使REGEXP比較區分大小寫,使用BINARY關鍵字使其中一個字符串變為二進制字符串。該查詢只匹配名稱首字母的小寫‘b'。

 代碼如下 復制代碼 mysql> SELECT * FROM pet WHERE name REGEXP BINARY ‘^b';
為了找出以“fy”結尾的名字,使用“$”匹配名字的結尾:
mysql> SELECT * FROM pet WHERE name REGEXP ‘fy$';
+——–+——–+———+——+————+——-+
| name| owner | species | sex | birth | death |
+——–+——–+———+——+————+——-+
| Fluffy | Harold | cat| f | 1993-02-04 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——–+——–+———+——+————+——-+
為了找出包含一個“w”的名字,使用以下查詢:
mysql> SELECT * FROM pet WHERE name REGEXP ‘w';
+———-+——-+———+——+————+————+
| name| owner | species | sex | birth | death |
+———-+——-+———+——+————+————+
| Claws | Gwen | cat| m | 1994-03-17 | NULL|
| Bowser| Diane | dog| m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL|
+———-+——-+———+——+————+————+

既然如果一個正則表達式出現在值的任何地方,其模式匹配了,就不必在先前的查詢中在模式的兩側放置一個通配符以使得它匹配整個值,就像你使用了一個SQL模式那樣。
為了找出包含正好5個字符的名字,使用“^”和“$”匹配名字的開始和結尾,和5個“.”實例在兩者之間:

 代碼如下 復制代碼 mysql> SELECT * FROM pet WHERE name REGEXP ‘^…..$';
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen| cat| m | 1994-03-17 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+

你也可以使用“{n}”“重復n次”操作符重寫前面的查詢:

 代碼如下 復制代碼 mysql> SELECT * FROM pet WHERE name REGEXP ‘^.{5}$';
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen| cat| m | 1994-03-17 | NULL |
| Buffy | Harold | dog| f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+

附錄G:MySQL正則表達式 提供了關於正則表達式的句法的詳細信息。
^
所匹配的字符串以後面的字符串開頭

 代碼如下 復制代碼 mysql> select “fonfo” REGEXP “^fo$”; -> 0(表示不匹配)
mysql> select “fofo” REGEXP “^fo”; -> 1(表示匹配)
$
所匹配的字符串以前面的字符串結尾
mysql> select “fono” REGEXP “^fono$”; -> 1(表示匹配)
mysql> select “fono” REGEXP “^fo$”; -> 0(表示不匹配)
.
匹配任何字符(包括新行)
mysql> select “fofo” REGEXP “^f.*”; -> 1(表示匹配)
mysql> select “fonfo” REGEXP “^f.*”; -> 1(表示匹配)
a*
匹配任意多個a(包括空串)
mysql> select “Ban” REGEXP “^Ba*n”; -> 1(表示匹配)
mysql> select “Baaan” REGEXP “^Ba*n”; -> 1(表示匹配)
mysql> select “Bn” REGEXP “^Ba*n”; -> 1(表示匹配)
a+
匹配1個或多個a字符的任何序列。
mysql> select “Ban” REGEXP “^Ba+n”; -> 1(表示匹配)
mysql> select “Bn” REGEXP “^Ba+n”; -> 0(表示不匹配)
a?
匹配一個或零個a
mysql> select “Bn” REGEXP “^Ba?n”; -> 1(表示匹配)
mysql> select “Ban” REGEXP “^Ba?n”; -> 1(表示匹配)
mysql> select “Baan” REGEXP “^Ba?n”; -> 0(表示不匹配)
de|abc
匹配de或abc
mysql> select “pi” REGEXP “pi|apa”; -> 1(表示匹配)
mysql> select “axe” REGEXP “pi|apa”; -> 0(表示不匹配)
mysql> select “apa” REGEXP “pi|apa”; -> 1(表示匹配)
mysql> select “apa” REGEXP “^(pi|apa)$”; -> 1(表示匹配)
mysql> select “pi” REGEXP “^(pi|apa)$”; -> 1(表示匹配)
mysql> select “pix” REGEXP “^(pi|apa)$”; -> 0(表示不匹配)
(abc)*
匹配任意多個abc(包括空串)
mysql> select “pi” REGEXP “^(pi)*$”; -> 1(表示匹配)
mysql> select “pip” REGEXP “^(pi)*$”; -> 0(表示不匹配)
mysql> select “pipi” REGEXP “^(pi)*$”; -> 1(表示匹配)
{1} {2,3}

這是一個更全面的方法,它可以實現前面好幾種保留字的功能
a*
可以寫成a{0,}
a
可以寫成a{1,}
a?
可以寫成a{0,1}
在{}內只有一個整型參數i,表示字符只能出現i次;在{}內有一個整型參數i,
後面跟一個“,”,表示字符可以出現i次或i次以上;在{}內只有一個整型參數i,
後面跟一個“,”,再跟一個整型參數j,表示字符只能出現i次以上,j次以下
(包括i次和j次)。其中的整型參數必須大於等於0,小於等於 RE_DUP_MAX(默認是25
5)。 如果同時給定了m和n,m必須小於或等於n.
[a-dX], [^a-dX]
匹配任何是(或不是,如果使用^的話)a、b、c、d或X的字符。兩個其他字符之間的“-”字符構成一個范圍,與從第1個字符開始到第2個字符之間的所有字符匹配。例如,[0-9]匹配任何十進制數字 。要想包含文字字符“]”,它必須緊跟在開括號“[”之後。要想包含文字字符“-”,它必須首先或最後寫入。對於[]對內未定義任何特殊含義的任何字符,僅與其本身匹配。

 代碼如下 復制代碼 mysql> select “aXbc” REGEXP “[a-dXYZ]“; -> 1(表示匹配)
mysql> select “aXbc” REGEXP “^[a-dXYZ]$”; -> 0(表示不匹配)
mysql> select “aXbc” REGEXP “^[a-dXYZ] $”; -> 1(表示匹配)
mysql> select “aXbc” REGEXP “^[^a-dXYZ] $”; -> 0(表示不匹配)
mysql> select “gheis” REGEXP “^[^a-dXYZ] $”; -> 1(表示匹配)
mysql> select “gheisa” REGEXP “^[^a-dXYZ] $”; -> 0(表示不匹配)
[[.characters.]]

表示比較元素的順序。在括號內的字符順序是唯一的。但是括號中可以包含通配符,
所以他能匹配更多的字符。舉例來說:正則表達式[[.ch.]]*c匹配chchcc的前五個字符

[=character_class=]
表示相等的類,可以代替類中其他相等的元素,包括它自己。例如,如果o和( )是
一個相等的類的成員,那麼[[=o=]]、[[=( )=]]和[o( )]是完全等價的。
[:character_class:]
在括號裡面,在[: 和:]中間是字符類的名字,可以代表屬於這個類的所有字符。
字符類的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe
r、cntrl、print和 xdigit
mysql> select “justalnums” REGEXP “[[:alnum:]] “; -> 1(表示匹配)
mysql> select “!!” REGEXP “[[:alnum:]] “; -> 0(表示不匹配)
alnum 文字數字字符
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 數字字符
graph 圖形字符
lower 小寫文字字符
print 圖形或空格字符
punct 標點字符
space 空格、制表符、新行、和回車
upper 大寫文字字符
xdigit 十六進制數字字符
[[:<:]]
[[:>:]]
分別匹配一個單詞開頭和結尾的空的字符串,這個單詞開頭和結尾都不是包含在alnum中
的字符也不能是下劃線。
mysql> select “a word a” REGEXP “[[:<:]]word[[:>:]]”; -> 1(表示匹配)
mysql> select “a xword a” REGEXP “[[:<:]]word[[:>:]]”; -> 0(表示不匹配)
mysql> select “weeknights” REGEXP “^(wee|week)(knights|nights)$”; -> 1(表示
匹配)
要想在正則表達式中使用特殊字符的文字實例,應在其前面加上2個反斜槓“”字符。MySQL解析程序負責解釋其中一個,正則表達式庫負責解釋另一個。例如,要想與包含特殊字符“+”的字符串“1+2” 匹配,在下面的正則表達式中,只有最後一個是正確的:

 代碼如下 復制代碼 mysql> SELECT ‘1+2′ REGEXP ‘1+2′; -> 0
mysql> SELECT ‘1+2′ REGEXP ‘1+2′; -> 0
mysql> SELECT ‘1+2′ REGEXP ‘1\+2′; -> 1


首先描述一下,遇到的問題:
以下是數據庫中的一個表mt2:

 代碼如下 復制代碼 +----+------------------------------------------+
| id | name                                     |
+----+------------------------------------------+
|  1 | sdfsf<contact>beijing</contact>sldjfsld  |
|  2 | sdfsf<contact>shanghai</contact>sldjfsld |
|  3 | sdfsf<contact>jn</contact>sldjfsld       |
|  4 | sdfsf<contact>qd</contact>sldjfsld       |
+----+------------------------------------------+

遇到的要求是:將該表中<contact>到</contact>的內容刪除。
眾所周知,replace函數是不支持正則表達式的,所以只能采用其他的方法處理。
於是,我是使用了下面的sql語句:

 代碼如下 復制代碼

update mt2 set name = replace(name, substring(name, locate('<contact>', name),locate('</contact>', name)-locate('<contact>'+10, name)),''); 

字符串(正則) 模糊

問題解決了。

結果:

 代碼如下 復制代碼 +----+-------------------+
| id | name              |
+----+-------------------+
|  1 | sdfsfactsldjfsld |
|  2 | sdfsfactsldjfsld |
|  3 | sdfsfactsldjfsld |
|  4 | sdfsfactsldjfsld |
+----+-------------------+

下面描述下,所用到的函數:
locate:

LOCATE(substr,str)
POSITION(substr IN str)
返回子串 substr 在字符串 str 中第一次出現的位置。如果子串 substr 在 str 中不存在,返回值為 0:

substring

SUBSTR(str,pos,len): 由<str>中的第<pos>位置開始,選出接下去的<len>個字元。

replace

replace(str1, str2, str3): 在字串 str1 中,? str2 出??r,?⑵湟 str3 替代。

缺點:只能唯一出現一次<contact>到</contact>,出現多次只能多分成多次替換了

copyright © 萬盛學電腦網 all rights reserved