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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...