mysql必知必會--用正則表達式 進行搜索

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/21/12222515.html
-Advertisement-
Play Games

正則表達式介紹 前兩章中的過濾例子允許用匹配、比較和通配操作符尋找數據。對 於基本的過濾(或者甚至是某些不那麼基本的過濾),這樣就足夠了。但 隨著過濾條件的複雜性的增加, WHERE 子句本身的複雜性也有必要增加。 這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本 的特殊的串(字元集合)。 ...


正則表達式介紹

前兩章中的過濾例子允許用匹配、比較和通配操作符尋找數據。對
於基本的過濾(或者甚至是某些不那麼基本的過濾),這樣就足夠了。但
隨著過濾條件的複雜性的增加, WHERE 子句本身的複雜性也有必要增加。
這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本
的特殊的串(字元集合)。如果你想從一個文本文件中提取電話號碼,可
以使用正則表達式。如果你需要查找名字中間有數字的所有文件,可以
使用一個正則表達式。如果你想在一個文本塊中找到所有重覆的單詞,
可以使用一個正則表達式。如果你想替換一個頁面中的所有URL為這些
URL的實際HTML鏈接,也可以使用一個正則表達式(對於最後這個例子,
或者是兩個正則表達式)。
所有種類的程式設計語言、文本編輯器、操作系統等都支持正則表
達式。有見識的程式員和網路管理員已經關註作為他們技術工具重要內
容的正則表達式很長時間了。
正則表達式用正則表達式語言來建立,正則表達式語言是用來完成
剛討論的所有工作以及更多工作的一種特殊語言。與任意語言一樣,正
則表達式具有你必須學習的特殊的語法和指令

使用MySQL正則表達式

那麼,正則表達式與MySQL有何關係?已經說過,正則表達式的作
用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL
用 WHERE 子句對正則表達式提供了初步的支持,允許你指定正則表達式,
過濾 SELECT 檢索出的數據

僅為正則表達式語言的一個子集 如果你熟悉正則表達式,需
要註意:MySQL僅支持多數正則表達式實現的一個很小的子
集。本章介紹MySQL支持的大多數內容。

基本字元匹配

我們從一個非常簡單的例子開始。下麵的語句檢索列 prod_name 包含
文本 1000 的所有行

除關鍵字 LIKE 被 REGEXP 替代外,這條語句看上去非常像使用
LIKE 的語句(第8章)。它告訴MySQL: REGEXP 後所跟的東西作
為正則表達式(與文字正文 1000 匹配的一個正則表達式)處理

為什麼要費力地使用正則表達式?在剛纔的例子中,正則表達式確
實沒有帶來太多好處(可能還會降低性能),不過,請考慮下麵的例子

這裡使用了正則表達式 .000 。 . 是正則表達式語言中一個特殊
的字元。它表示匹配任意一個字元,因此, 1000 和 2000 都匹配
且返回。
當然,這個特殊的例子也可以用 LIKE 和通配符來完成

LIKE 匹配整個列。如果被匹配的文本在列值
中出現, LIKE 將不會找到它,相應的行也不被返回(除非使用
通配符)。而 REGEXP 在列值內進行匹配,如果被匹配的文本在
列值中出現, REGEXP 將會找到它,相應的行將被返回。這是一
個非常重要的差別。的作用)?答案是肯定的,使用 ^ 和 $ 定位符(anchor)即可,
本章後面介紹。

匹配不區分大小寫 MySQL中的正則表達式匹配(自版本
3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。為區分大
小寫,可使用 BINARY 關鍵字,如 WHERE prod_name REGEXP
BINARY 'JetPack .000'

匹配幾個字元之一

匹配任何單一字元。但是,如果你只想匹配特定的字元,怎麼辦?
可通過指定一組用 [ 和 ] 括起來的字元來完成,如下所示:

這裡,使用了正則表達式 [123] Ton 。 [123] 定義一組字元,它
的意思是匹配 1 或 2 或 3 ,因此, 1 ton 和 2 ton 都匹配且返回(沒
有 3 ton )。
正如所見, [] 是另一種形式的 OR 語句。事實上,正則表達式 [123]Ton
為 [1|2|3]Ton 的縮寫,也可以使用後者。但是,需要用 [] 來定義 OR 語句
查找什麼。為更好地理解這一點,請看下麵的例子:


這並不是期望的輸出。兩個要求的行被檢索出來,但還檢索出
了另外3行。之所以這樣是由於MySQL假定你的意思是 '1' 或
'2' 或 '3 ton' 。除非把字元 | 括在一個集合中,否則它將應用於整個串。
字元集合也可以被否定,即,它們將匹配除指定字元外的任何東西。
為否定一個字元集,在集合的開始處放置一個 ^ 即可。因此,儘管 [123]
匹配字元 1 、 2 或 3 ,但 [^123] 卻匹配除這些字元外的任何東西

匹配範圍

集合可用來定義要匹配的一個或多個字元。例如,下麵的集合將匹
配數字0到9:

這裡使用正則表達式 [1-5] Ton 。 [1-5] 定義了一個範圍,這個
表達式意思是匹配 1 到 5 ,因此返回3個匹配行。由於 5 ton 匹配,
所以返回 .5 ton 。

匹配特殊字元

正則表達式語言由具有特定含義的特殊字元構成。我們已經看到 . 、 [] 、
| 和 - 等,還有其他一些字元。請問,如果你需要匹配這些字元,應該怎麼
辦呢?例如,如果要找出包含 . 字元的值,怎樣搜索?請看下麵的例子

這並不是期望的輸出, . 匹配任意字元,因此每個行都被檢索出
來。為了匹配特殊字元,必須用 \ 為前導。 \- 表示查找 - , \. 表示查找 .

這種處理
就是所謂的轉義(escaping),正則表達式內具有特殊意義的所
有字元都必須以這種方式轉義。這包括 . 、 | 、 [] 以及迄今為止使用過的
其他特殊字元。
\ 也用來引用元字元(具有特殊含義的字元),如表9-1所列。

匹配  為了匹配反斜杠(  )字元本身,需要使用 \ 。
 或 \? 多數正則表達式實現使用單個反斜杠轉義特殊字元,
以便能使用這些字元本身。但MySQL要求兩個反斜杠(MySQL
自己解釋一個,正則表達式庫解釋另一個)。

匹配字元類

存在找出你自己經常使用的數字、所有字母字元或所有數字字母字
符等的匹配。為更方便工作,可以使用預定義的字元集,稱為字元類
(character class)。表9-2列出字元類以及它們的含義

匹配多個實例

目前為止使用的所有正則表達式都試圖匹配單次出現。如果存在一
個匹配,該行被檢索出來,如果不存在,檢索不出任何行。但有時需要
對匹配的數目進行更強的控制。例如,你可能需要尋找所有的數,不管
數中包含多少數字,或者你可能想尋找一個單詞並且還能夠適應一個尾
隨的 s (如果存在),等等
這可以用表9-3列出的正則表達式重覆元字元來完成

定位符

目前為止的所有例子都是匹配一個串中任意位置的文本。為了匹配特定位置的文本,需要使用表9-4列出的定位符

例如,如果你想找出以一個數(包括以小數點開始的數)開始的所
有產品,怎麼辦?簡單搜索 [0-9\.] (或 [[:digit:]\.] )不行,因為
它將在文本內任意位置查找匹配。解決辦法是使用 ^ 定位符,如下所示

^ 匹配串的開始。因此, ^[0-9\.] 只在 . 或任意數字為串中第
一個字元時才匹配它們。

^ 的雙重用途 ^ 有兩種用法。在集合中(用 [ 和 ] 定義),用它
來否定該集合,否則,用來指串的開始處

使 REGEXP 起類似 LIKE 的作用 本章前面說過, LIKE 和 REGEXP
的不同在於, LIKE 匹配整個串而 REGEXP 匹配子串。利用定位
符,通過用 ^ 開始每個表達式,用 $ 結束每個表達式,可以使
REGEXP 的作用與 LIKE 一樣

本章介紹了正則表達式的基礎知識,學習瞭如何在MySQL的 SELECT
語句中通過 REGEXP 關鍵字使用它們


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是該系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore。 1. 第1部分 使用 來簡化ASP.NET Core的日誌輸出(本篇文章) 2. 第2部分 使用Serilog記錄所選的端點名稱[敬請期待] 3. 第3部分 使用Serilog.AspNetCor ...
  • 話不多說,先看運行效果: >./term input flag 0x00000500 BRKINT not in ICRNL IGNBRK not in IGNCR not in IGNPAR not in IMAXBEL not in INLCR not in INPCK not in ISTRI ...
  • 據報道三星已經成功研發出有望替代嵌入式快閃記憶體存儲器(eFlash)的嵌入式磁阻隨機訪問記憶體(eMRAM),容量為1Gb,測試晶元的優良率已達90%。 隨著5G物聯網時代的來臨,存儲器領域發展快速,而在這一領域,韓系廠商擁有著比較明顯的優勢。 MRAM晶元是一種以電阻為存儲方式結合非易失性及隨機訪問兩種 ...
  • 思路:一臺Server 2016用作AD+DNS,一臺Server 2016用作Exchange Server 2016 Exchange Server 2016 CU14 安裝路徑:安裝路徑:https://www.microsoft.com/en-us/download/details.aspx ...
  • WEB管理工具 WebVirtMgr WebVirtMgr是一個基於libvirt的Web界面,用於管理虛擬機。它允許您創建和配置新域,並調整域的資源分配。VNC查看器為來賓域提供完整的圖形控制台。KVM是目前唯一支持的虛擬機管理程式。 基礎環境 hosts免密登錄 kvm所用的所有伺服器都需要互相 ...
  • JDK 的安裝系統安裝就不做過多介紹,大家從網上尋找安裝步驟進行安裝,不過我推薦大家進行安裝時選擇桌面圖形化格式進行安裝,方便做一部分操作,同時在安裝過程中選擇英文模式,同時我自己在安裝的過程中發現使用Oracle VM VirtualBox這個虛擬機工具比使用VM工具開發更加方便些 使用工具 系統 ...
  • 造成這種情況的原因有很多,如果直接百度錯誤信息的話,不一定能很快解決問題,所以,出現這種情況,我們可以使用 mysqld console 命令來查看報錯信息,然後根據報錯信息來百度,這樣就很快定位到問題所在。看到以下截圖,我的問題是 Please make sure that directory e ...
  • 推薦閱讀: 論主數據的重要性(正確理解元數據、數據元) CDC+ETL實現數據集成方案 Java實現impala操作kudu 實戰kudu集成impala impala基本介紹 impala是cloudera提供的一款高效率的sql查詢工具,提供實時的查詢效果,官方測試性能比hive快10到100倍 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...