老鐵們,大家好,相信還有很多朋友對于regexp正則表達式用法和正則表達式判斷是否包含指定字符串的相關問題不太懂,沒關系,今天就由我來為大家分享分享regexp正則表達式用法以及正則表達式判斷是否包含指定字符串的問題,文章篇幅可能偏長,希望可以幫助到大家,下面一起來看看吧!
MySQL正則表達式入門教程
MySQL一直以來都支持正則匹配,不過對于正則替換則一直到MySQL8.0才支持。對于這類場景,以前要么在MySQL端處理,要么把數據拿出來在應用端處理。
比如我想把表y1的列str1的出現第3個action的子串替換成dble,怎么實現?
1.自己寫SQL層的存儲函數。代碼如下寫死了3個,沒有優化,僅僅作為演示,MySQL里非常不建議寫這樣的函數。
mysql
DELIMITER$$
USE`ytt`$$
DROPFUNCTIONIFEXISTS`func_instr_simple_ytt`$$
CREATEDEFINER=`root`@`localhost`FUNCTION`func_instr_simple_ytt`(
f_strVARCHAR(1000),--Parameter1
f_substrVARCHAR(100),--Parameter2
f_replace_strvarchar(100),
f_timesint--timescounter.onlysupport3.
)RETURNSvarchar(1000)
BEGIN
declarev_resultvarchar(1000)default'ytt';--result.
declarev_substr_lenintdefault0;--searchstringlength.
setf_times=3;--onlysupport3.
setv_substr_len=length(f_substr);
selectinstr(f_str,f_substr)into@p1;--Firstrealposition.
selectinstr(substr(f_str,@p1+v_substr_len),f_substr)into@p2;Secondaryvirtualposition.
selectinstr(substr(f_str,@p2+@p1+2*v_substr_len-1),f_substr)into@p3;--Thirdvirtualposition.
if@p1>0&&@p2>0&&@p3>0then--Fine.
select
concat(substr(f_str,1,@p1+@p2+@p3+(f_times-1)*v_substr_len-f_times)
,f_replace_str,
substr(f_str,@p1+@p2+@p3+f_times*v_substr_len-2))intov_result;
else
setv_result=f_str;--Neverchanged.
endif;
--Purgeallsessionvariables.
set@p1=null;
set@p2=null;
set@p3=null;
returnv_result;
end;
$$
DELIMITER;
--調用函數來更新:
mysql>updatey1setstr1=func_instr_simple_ytt(str1,'action','dble',3);
QueryOK,20rowsaffected(0.12sec)
Rowsmatched:20Changed:20Warnings:0
2.導出來用sed之類的工具替換掉在導入,步驟如下:(推薦使用)1)導出表y1的記錄。
mysqlmysql>select*fromy1intooutfile'/var/lib/mysql-files/y1.csv';QueryOK,20rowsaffected(0.00sec)
2)用sed替換導出來的數據。
shellroot@ytt-Aspire-V5-471G:/var/lib/mysql-files#sed-i's/action/dble/3'y1.csv
3)再次導入處理好的數據,完成。
mysql
mysql>truncatey1;
QueryOK,0rowsaffected(0.99sec)
mysql>loaddatainfile'/var/lib/mysql-files/y1.csv'intotabley1;
QueryOK,20rowsaffected(0.14sec)
Records:20Deleted:0Skipped:0Warnings:0
以上兩種還是推薦導出來處理好了再重新導入,性能來的高些,而且還不用自己費勁寫函數代碼。那MySQL8.0對于以上的場景實現就非常簡單了,一個函數就搞定了。
mysqlmysql>updatey1setstr1=regexp_replace(str1,'action','dble',1,3);QueryOK,20rowsaffected(0.13sec)Rowsmatched:20Changed:20Warnings:0
還有一個regexp_instr也非常有用,特別是這種特指出現第幾次的場景。比如定義SESSION變量@a。
mysqlmysql>set@a='aabbcceefilucy111bs234523556119101020301040';QueryOK,0rowsaffected(0.04sec)
拿到至少兩次的數字出現的第二次子串的位置。
mysqlmysql>selectregexp_instr(@a,'[:digit:]{2,}',1,2);+--------------------------------------+|regexp_instr(@a,'[:digit:]{2,}',1,2)|+--------------------------------------+|50|+--------------------------------------+1rowinset(0.00sec)
那我們在看看對多字節字符支持如何。
mysql
mysql>set@a='中國美國俄羅斯日本中國北京上海深圳廣州北京上海武漢東莞北京青島北京';
QueryOK,0rowsaffected(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,1);
+-------------------------------+
|regexp_instr(@a,'北京',1,1)|
+-------------------------------+
|17|
+-------------------------------+
1rowinset(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,2);
+-------------------------------+
|regexp_instr(@a,'北京',1,2)|
+-------------------------------+
|29|
+-------------------------------+
1rowinset(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,3);
+-------------------------------+
|regexp_instr(@a,'北京',1,3)|
+-------------------------------+
|41|
+-------------------------------+
1rowinset(0.00sec)
那總結下,這里我提到了MySQL8.0的兩個最有用的正則匹配函數regexp_replace和regexp_instr。針對以前類似的場景算是有一個完美的解決方案。
MySQL中使用replace、regexp進行正則表達式替換的用法分析
mysql的正則匹配用regexp,而替換字符串用REPLACE(str,from_str,to_str)舉例如下:
UPDATEmyTableSETHTML=REPLACE(HTML,'','')WHEREHTMLREGEXP'(\s*){2,}'達到的效果:會把所有全部替換掉。mysql中常用的替換函數所用到的函數:
locate:LOCATE(substr,str)POSITION(substrINstr)返回子串substr在字符串str中第一次出現的位置。
如果子串substr在str中不存在,返回值為0:substringSUBSTR(str,pos,len):由
正則表達式中怎么匹配換行符
\n是回車換行,就是光標移動到下一行,從下一行開始輸入輸出。跟換行符效果一樣。\r則只是回車,光標不移動。正則表達式,又稱正規表示法、常規表示法(英語:RegularExpression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,復數有regexps、regexes、regexen。
regexp函數用法
REGEXP函數是一種正則表達式函數,用于在文本中搜索匹配模式。它可以在各種編程語言和數據庫系統中使用。
在MySQL中,REGEXP函數的語法如下:
REGEXP(string,pattern)
string:要進行匹配的字符串pattern:正則表達式模式
返回值為1則表示匹配成功,否則返回0。
例如,要查詢表中name列中以字母"a"開頭的所有記錄,可以使用以下查詢:
SELECT*FROMtable_nameWHEREnameREGEXP'^a';
另外在其他語言中如python,javascript也有類似的函數供你使用,但是語法和用法可能會有所不同。
正則表達式是一種非常強大的字符串匹配工具,如果你想更深入的了解正則表達式的用法和語法可以查閱相關文檔。
什么是正則算符
正則表達式(RegularExpression,又稱規則表達式,在代碼中常簡寫為regex、regexp或RE)是指對有限自動機所接受的語言或時序開關電路的行為的形式描述。
正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。
正則表達式如何匹配空值
正則表達式匹配空值方式如下:
\b匹配單詞開頭或結尾位置
^匹配字符串開端位置
$匹配字符串結尾位置
\s匹配一切空白字符
\n匹配換行
正則表達式,又稱正規表示法、常規表示法(英語:RegularExpression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
關于regexp正則表達式用法,正則表達式判斷是否包含指定字符串的介紹到此結束,希望對大家有所幫助。