佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Mysql中正則表達(dá)式Regexp常見(jiàn)用法

Mysql中正則表達(dá)式Regexp常見(jiàn)用法

熱門(mén)標(biāo)簽:服務(wù)外包 鐵路電話系統(tǒng) AI電銷(xiāo) Linux服務(wù)器 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 地方門(mén)戶網(wǎng)站

Mysql中Regexp常見(jiàn)用法

模糊匹配,包含特定字符串
# 查找content字段中包含“車(chē)友俱樂(lè)部”的記錄

select * from club_content where content regexp '車(chē)友俱樂(lè)部'

# 此時(shí)的regexp與like的以下用法是等同的

select * from club_content where content like '%車(chē)友俱樂(lè)部%'

模糊匹配,以特定字符串開(kāi)頭
# 查找content字段中以“車(chē)友”開(kāi)頭的記錄

select * from club_content where content regexp '^車(chē)友'

# 此時(shí)的regexp與like的以下用法是等同的

select * from club_content where content like '車(chē)友%'

模糊匹配,以特定字符串結(jié)尾
# 查找content字段中以“車(chē)友”結(jié)尾的記錄

select * from club_content where content regexp '車(chē)友$'

# 此時(shí)的regexp與like的以下用法是等同的

select * from club_content where content like '%車(chē)友'

模糊匹配,或關(guān)系
# 查找content字段中包含“心得”、“分享”或“技術(shù)貼”

select * from club_content where content REGEXP '心得|分享|技術(shù)貼'

模糊匹配,不包含單個(gè)字符
# 查找content字段中不包含“車(chē)”字、“友”字的記錄

select * from club_content where content REGEXP [^車(chē)友]

這個(gè)結(jié)果跑出來(lái)一看大吃一驚,竟然把所有記錄給跑出來(lái),這是為什么呢?
因?yàn)橐坏┘恿诉@個(gè)方括號(hào)"[]",它就把里面的內(nèi)容拆成單個(gè)的字符再匹配,它會(huì)逐個(gè)字符去匹配判斷是不是等于“車(chē)”,或者是不是等于“友“,返回的結(jié)果是一組0、1的邏輯值。

如果想匹配不包含特定字符串,該怎么實(shí)現(xiàn)呢?

模糊匹配,不包含特定字符串
# 查找content字段不包含“車(chē)友”字符串的記錄

select * from club_content where content not REGEXP '車(chē)友'

MySql REGEXP運(yùn)算符匹配字符串

1 ^ 匹配以該字符后面的字符開(kāi)頭的字符串
舉個(gè)例子: REGEXP ‘^x' 表示匹配以x開(kāi)頭的字符
2 $匹配以該字符前面的字符結(jié)尾的字符串
舉個(gè)例子: REGEXP ‘y$' 表示匹配以y結(jié)尾的字符
3 .匹配任意一個(gè)字符
4 […]匹配在方括號(hào)中的任意一個(gè)字符。
如: [1-9] 匹配1到9的數(shù)字, [abc]匹配其中任意一個(gè)
5 *匹配零個(gè)或多個(gè)在它前面的字符
如: x* 匹配任何數(shù)量的x字符

mysql 如何判斷 "字符串" 是否為 "數(shù)字"

這個(gè)問(wèn)題有點(diǎn)怪 ,但很多時(shí)候我們會(huì)以字符串的形式存儲(chǔ)數(shù)字 , 反過(guò)來(lái)我們用字符串進(jìn)行數(shù)學(xué)運(yùn)算時(shí), 好像也不會(huì)出錯(cuò) . 除非 , 用作數(shù)學(xué)運(yùn)算的字符串不能轉(zhuǎn)換成數(shù)字 .
但是我們改如何判斷字符串是否能轉(zhuǎn)換成數(shù)字呢 ?

采用mysql的 REGEXP運(yùn)算符 . 怎么用?

{String} REGEXP '[^0-9.]'

前面的字符串是我們要做判斷的, 后面的字符串是mysql的正則表達(dá)式,意思是 匹配不是數(shù)字或者小數(shù)點(diǎn)的字符。

如果String中含有不是0-9之間的數(shù)字或者是小數(shù)點(diǎn)時(shí),返回true ,反之則返回false。

比如說(shuō) :

select ('123a' REGEXP '[^0-9.]'); --‘123a'中含有字符'a' 輸出結(jié)果為1 mysql中常量true輸出為1 false輸出為0

注意:如果字符串中有空格,也會(huì)匹配到正則表達(dá)式,返回1。如果是要去掉兩端的空格,就要將判斷的字符串,就要對(duì)字符串使用 trim()函數(shù)了。

這個(gè)只是REGEXP操作符的簡(jiǎn)單應(yīng)用,REGEXP的詳細(xì)應(yīng)用請(qǐng)參考官方文檔?!?br />

MySQL 正則表達(dá)式

在前面的章節(jié)我們已經(jīng)了解到MySQL可以通過(guò) LIKE ...% 來(lái)進(jìn)行模糊匹配。

MySQL 同樣也支持其他正則表達(dá)式的匹配, MySQL中使用 REGEXP 操作符來(lái)進(jìn)行正則表達(dá)式匹配。

如果您了解PHP或Perl,那么操作起來(lái)就非常簡(jiǎn)單,因?yàn)镸ySQL的正則表達(dá)式匹配與這些腳本的類(lèi)似。

下表中的正則模式可應(yīng)用于 REGEXP 操作符中。

模式 描述
^ 匹配輸入字符串的開(kāi)始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 '\n' 在內(nèi)的任何字符,請(qǐng)使用象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一個(gè)字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 負(fù)值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
* 匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價(jià)于{0,}。
+ 匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
{n} n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
{n,m} m 和 n 均為非負(fù)整數(shù),其中n = m。最少匹配 n 次且最多匹配 m 次。

實(shí)例

了解以上的正則需求后,我們就可以根據(jù)自己的需求來(lái)編寫(xiě)帶有正則表達(dá)式的SQL語(yǔ)句。以下我們將列出幾個(gè)小實(shí)例(表名:person_tbl )來(lái)加深我們的理解:

查找name字段中以'st'為開(kāi)頭的所有數(shù)據(jù):

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'為結(jié)尾的所有數(shù)據(jù):

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有數(shù)據(jù):

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符開(kāi)頭或以'ok'字符串結(jié)尾的所有數(shù)據(jù):

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

mysql正則REGEXP學(xué)習(xí)練習(xí)筆記

REGEXP在mysql是用來(lái)執(zhí)行正則表達(dá)式的一個(gè)函數(shù),像php中的preg之類(lèi)的函數(shù)了,regexp正則函數(shù)如果只是簡(jiǎn)單的查詢使用like即可,但復(fù)雜的還是需要使用regexp了,下面我們來(lái)看看。

MySql用戶手冊(cè)建議,在構(gòu)造簡(jiǎn)單查詢時(shí),仍使用通配符。

如:

Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

但在一些特殊查詢中,不用正則表達(dá)式是不行的。MYSQL提供的正則表達(dá)式WHERE謂詞有三個(gè),分別是:

REGEXP, RLIKE, NOT RLIKE

用這三個(gè)替換原有的LIKE謂詞,后面即可以跟正則表達(dá)式。
例如要查詢字段中含有“_”的數(shù)據(jù),則要用以下查詢語(yǔ)句:

SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

擴(kuò)展正則表達(dá)式的一些字符是:

· ‘.'匹配任何單個(gè)的字符。
· 字符類(lèi)“[...]”匹配在方括號(hào)內(nèi)的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。為了命名字符的范圍,使用一個(gè)“-”?!癧a-z]”匹配任何字母,而“[0-9]”匹配任何數(shù)字。
· “ * ”匹配零個(gè)或多個(gè)在它前面的字符。例如,“x*”匹配任何數(shù)量的“x”字符,“[0-9]*”匹配任何數(shù)量的數(shù)字,而“.*”匹配任何數(shù)量的任何字符。
如果REGEXP模式與被測(cè)試值的任何地方匹配,模式就匹配(這不同于LIKE模式匹配,只有與整個(gè)值匹配,模式才匹配)。
為了定位一個(gè)模式以便它必須匹配被測(cè)試值的開(kāi)始或結(jié)尾,在模式開(kāi)始處使用“^”或在模式的結(jié)尾用“$”。
為了找出以“b”開(kāi)頭的名字,使用“^”匹配名字的開(kāi)始:
使用正則

SELECT * FROM pet WHERE name REGEXP BINARY ‘^b';
SELECT * FROM pet WHERE name REGEXP ‘fy$';
SELECT * FROM pet WHERE name REGEXP ‘w';
SELECT * FROM pet WHERE name REGEXP ‘^…..$';
SELECT * FROM pet WHERE name REGEXP ‘^.{5}$';

今天在應(yīng)用中遇到了這樣的一個(gè)問(wèn)題,

有一個(gè)字段 t1,其中的值類(lèi)似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2
需要從里面搜索出比如說(shuō):第一個(gè)逗號(hào)前的數(shù)字范圍為3-5之間,第三個(gè)逗號(hào)前的數(shù)字的范圍為3-5之間,第10個(gè)逗號(hào)前的數(shù)字范圍為3-5之間,其余的都為1-5之間。。。
則sql語(yǔ)句可以這么寫(xiě):

SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';

1. 使用LIKE和NOT LIKE比較操作符(注意不能使用=或!=);
2. 模式默認(rèn)是忽略大小寫(xiě)的;
3. 允許使用”_”匹配任何單個(gè)字符,”%”匹配任意數(shù)目字符(包括零字符);

附一些mysql正則規(guī)則

^ 匹配字符串的開(kāi)始部分
$ 匹配字符串的結(jié)束部分
. 匹配任何字符(包括回車(chē)和新行)
a* 匹配0或多個(gè)a字符的任何序列
a+ 匹配1個(gè)或多個(gè)a字符的任何序列
a? 匹配0個(gè)或1個(gè)a字符
de|abc 匹配序列de或abc
(abc)* 匹配序列adc的0個(gè)或者多個(gè)實(shí)例

{n}、{m,n} {n}或{m,n}符號(hào)提供了編寫(xiě)正則表達(dá)式的更通用方式,能夠匹配模式的很多前述原子(或“部分”)。m和n均為整數(shù)。
a* 可被寫(xiě)為a{0,}
a+ 可被寫(xiě)為a{1,}
a? 可被寫(xiě)為a{0,1}

[a-dX] 匹配任何是a,b,c,d或者X的字符,兩個(gè)其他字符之間的'-'字符構(gòu)成一個(gè)范圍
[^a-dX] 匹配任何不是a,b,c,d或者X的字符,前面的字符'^'是否定的意思

[.characters.] 在括號(hào)表達(dá)式中(使用[和]),匹配用于校對(duì)元素的字符序列,字符為單個(gè)字符或新行等字符名
mysql> SELECT ‘~' REGEXP ‘[[.~.]]'; -> 1
mysql> SELECT ‘~' REGEXP ‘[[.tilde.]]'; -> 1

[=character_class=]
在括號(hào)表達(dá)式中(使用[和]),[=character_class=]表示等同類(lèi)。它與具有相同校對(duì)值的所有字符匹配,包括它本身,
[[=a=]] 等同于[a(+)],[a+],[a{1,}]

[:character_class:]
在括號(hào)表達(dá)式中(使用[和]),[:character_class:]表示與術(shù)語(yǔ)類(lèi)的所有字符匹配的字符類(lèi)。

標(biāo)準(zhǔn)的類(lèi)名稱(chēng)是:

alnum 文字?jǐn)?shù)字字符
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 數(shù)字字符
graph 圖形字符
lower 小寫(xiě)文字字符
print 圖形或空格字符
punct 標(biāo)點(diǎn)字符
space 空格、制表符、新行、和回車(chē)
upper 大寫(xiě)文字字符
xdigit 十六進(jìn)制數(shù)字字符

[[::]], [[:>:]]

這些標(biāo)記表示word邊界。它們分別與word的開(kāi)始和結(jié)束匹配。word是一系列字字符,其前面和后面均沒(méi)有字字符。字符是alnum類(lèi)中的字母數(shù)字字符或下劃線(_)。

mysql> select ‘fang shan zi' regexp ‘[[::]]shan[[:>:]]'; -> 1
mysql> select ‘fang shan zi' regexp ‘[[::]]fang[[:>:]]'; -> 1
mysql> select ‘fang shans zi' regexp ‘[[::]]shan[[:>:]]'; -> 0

正則表達(dá)式使用特殊字符,應(yīng)在其前面加上2個(gè)反斜杠''字符

mysql> SELECT '1+2′ REGEXP '1+2′; -> 0
mysql> SELECT '1+2′ REGEXP '1+2′; -> 0
mysql> SELECT '1+2′ REGEXP '1\+2′; -> 1

MySQL 查尋條件使用正則 regexp

我用的是 Mybatis

t.hobby : 條件字段
hobby : 查尋參數(shù),值可以是多個(gè)逗號(hào)分隔的值:‘閱讀,交友,圍棋'

!-- t.hobby 的值最初可能是這樣: '    吃,  喝,嫖,賭  , 抽,坑,蒙,拐,騙,偷 ' 每個(gè)詞的兩邊有空格不規(guī)則 -->
!-- 下面逐步演示 -->
if test="hobby!=null and hobby!=''">
 concat(',',REPLACE (t.hobby, ' ', ''),',') regexp concat(',(',replace(#{hobby},',','|'),'),')
/if>
!-- 表字段 t.hobby 取出值 -->
if test="hobby!=null and hobby!=''">
 concat(',',REPLACE ('    吃,  喝,嫖,賭  , 抽,坑,蒙,拐,騙,偷 ', ' ', ''),',') regexp concat(',(',replace(#{hobby},',','|'),'),')
/if>
!-- 表字段值處理后,去掉了多余的空格 -->
if test="hobby!=null and hobby!=''">
 concat(',','吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷',',') regexp concat(',(',replace(#{hobby},',','|'),'),')
/if>
!-- concat后得到一個(gè)字符串,首尾加上了逗號(hào) -->
if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷,' regexp concat(',(',replace(#{hobby},',','|'),'),')
/if>
!-- 取出參數(shù) #{hobby} 的值 -->
if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷,' regexp concat(',(',replace('吃,喝,嫖,嫖',',','|'),'),')
/if>
!-- 把逗號(hào)換成 |  -->
if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷,' regexp concat(',(','吃|喝|嫖|嫖','),')
/if>
!-- concat后得到一個(gè)字符串,首尾加上了括號(hào),逗號(hào)  -->
if test="hobby!=null and hobby!=''">
 ',吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷,' regexp ',(吃|喝|嫖|嫖),' !-- 紀(jì)念于謙老師不賭的美德 -->
/if>

得到結(jié)果是 1 作為條件就是真了。

復(fù)雜的過(guò)程主要是用來(lái)處理查尋條件。得到符合要求的正則作條件就ok了
但個(gè)人覺(jué)得,更理想的方式是:
被查尋字段在當(dāng)初存入數(shù)據(jù)時(shí)就處理好格式:'吃,喝,嫖,賭,抽,坑,蒙,拐,騙,偷'
查尋條件可以處理好傳進(jìn)來(lái):',(吃|喝|嫖|嫖),'
那么一個(gè)查尋就可以簡(jiǎn)化成這樣

if test="hobby!=null and hobby!=''">
 concat(',', t.hobby ,',') regexp #{hobby}
/if>

到這就差不多了,基本上就可以看得懂了,實(shí)在不行就參考下面的相關(guān)文章。

您可能感興趣的文章:
  • 正則表達(dá)式(RegExp)判斷文本框中是否包含特殊符號(hào)
  • MySQL中使用replace、regexp進(jìn)行正則表達(dá)式替換的用法分析
  • MySQL中REGEXP正則表達(dá)式使用大全
  • oracle正則表達(dá)式regexp_like的用法詳解
  • js正則表達(dá)式講解之index屬性(RegExp對(duì)象)
  • js正則表達(dá)式之RegExp對(duì)象屬性lastIndex,lastMatch,lastParen,lastContext,rightContext屬性講解
  • ES9的新特性之正則表達(dá)式RegExp詳解

標(biāo)簽:黃山 湖南 崇左 湘潭 仙桃 蘭州 銅川 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql中正則表達(dá)式Regexp常見(jiàn)用法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    高密市| 昌平区| 察隅县| 志丹县| 澎湖县| 新平| 库尔勒市| 景泰县| 墨竹工卡县| 尼勒克县| 咸宁市| 怀安县| 兴安县| 新巴尔虎右旗| 泽州县| 漳浦县| 威信县| 宝清县| 葵青区| 永泰县| 临桂县| 禄丰县| 孟连| 北宁市| 邢台县| 同江市| 宿迁市| 隆林| 米脂县| 新田县| 通榆县| 林西县| 长顺县| 长乐市| 安国市| 荣成市| 新和县| 蚌埠市| 蓬溪县| 永仁县| 定边县|