深入了解 Oracle 正則表達式

目錄

  • 深入了解 Oracle 正則表達式
    • 一、正則表達式基礎概念
    • 二、Oracle 正則表達式語法
      • (一)字符類
      • (二)重復限定符
      • (三)邊界匹配符
      • (四)分組和捕獲
    • 三、Oracle 正則表達式函數
      • (一)REGEXP\_LIKE 函數
      • (二)REGEXP\_REPLACE 函數
      • (三)REGEXP\_SUBSTR 函數
    • 四、實際應用場景
      • (一)數據清洗
      • (二)數據驗證
      • (三)文本分析
    • 五、注意事項
    • 六、總結

深入了解 Oracle 正則表達式

一、正則表達式基礎概念

正則表達式是一種用于描述、匹配和處理文本模式的強大工具,它通過特定的字符和符號組合來定義模式,進而在文本中實現查找、替換或提取符合條件的內容。在 Oracle 數據庫環境中,正則表達式廣泛應用于數據驗證、數據清洗以及文本分析等關鍵場景。

例如,從大量的用戶信息中提取郵箱地址,或者驗證用戶輸入的電話號碼是否符合規范,正則表達式都能輕松應對,為數據處理工作提供了極大的便利。

二、Oracle 正則表達式語法

(一)字符類

基本字符類

.(點):匹配除換行符外的任意單個字符。例如,‘a.c’ 能夠匹配 ‘abc’、‘a1c’ 等字符串,只要中間字符為任意單個字符(換行符除外)即可。

[字符集合]:匹配字符集合中的任意一個字符。比如,‘[aeiou]’ 專門用于匹配元音字母,當處理文本中需要篩選出元音字母相關內容時,這個字符類就非常有用。

[^ 字符集合]:匹配不在指定字符集合中的任意一個字符。例如,‘[^0-9]’ 可以精準匹配任何非數字字符,在處理需要排除數字的數據場景中發揮作用。

預定義字符類

\d:匹配任意一個數字字符,其功能等同于 [0-9]。像 ‘\d {3}’ 就能匹配三位連續的數字,如 ‘123’、‘456’ 等,常用于處理與數字位數相關的匹配需求。

\w:匹配任意一個字母、數字或下劃線字符,等價于 [a-zA-Z0-9_]。當我們需要處理包含字母、數字和下劃線組成的用戶名、文件名等數據時,‘\w+’ 可以匹配由這些字符組成的一個或多個字符的字符串。

\s:匹配任意一個空白字符,包括空格、制表符、換行符等,等價于 [\t\n\r\f]。在處理文本排版、格式整理等任務時,識別和處理空白字符是很常見的操作,‘\s’ 就派上了用場。

(二)重復限定符

{n}:表示前面的字符或表達式恰好出現 n 次。例如,‘a {3}’ 僅能匹配 ‘aaa’,不會匹配 ‘aa’ 或 ‘aaaa’,在需要精確匹配固定次數字符的場景中很實用。

{n,}:意味著前面的字符或表達式至少出現 n 次。例如,‘a {3,}’ 可以匹配 ‘aaa’、‘aaaa’、‘aaaaa’ 等,只要出現次數大于等于 3 次即可,適用于對出現次數有下限要求的匹配。

{n,m}:表示前面的字符或表達式出現次數在 n 到 m 之間(包括 n 和 m)。比如,‘a {3,5}’ 可以匹配 ‘aaa’、‘aaaa’、‘aaaaa’,滿足出現次數在 3 到 5 次之間的各種情況。

?:前面的字符或表達式出現 0 次或 1 次,等價于 {0,1}。例如,‘a?’ 可以匹配空字符串,也可以匹配 ‘a’,在處理某些可有可無字符的匹配時非常方便。

+:前面的字符或表達式出現 1 次或多次,等價于 {1,}。例如,‘a+’ 可以匹配 ‘a’、‘aa’、‘aaa’ 等,只要至少出現一次 ‘a’ 即可,常用于匹配至少出現一次的字符或表達式。

*:前面的字符或表達式出現 0 次或多次,等價于 {0,}。例如,‘a*’ 可以匹配空字符串,也可以匹配 ‘a’、‘aa’ 等任意次數出現 ‘a’ 的情況,靈活性較高。

(三)邊界匹配符

****:匹配字符串的開頭。例如,'abc’ 只會匹配以 ‘abc’ 開頭的字符串,在需要篩選特定開頭數據時很有效。

** ? ? :匹配字符串的結尾。例如 , ′ a b c **:匹配字符串的結尾。例如,'abc ??:匹配字符串的結尾。例如abc’ 僅能匹配以 ‘abc’ 結尾的字符串,對于處理特定結尾的數據場景很有用。

\b:匹配單詞邊界。例如,‘\bcat\b’ 可以匹配 ‘the cat is here’ 中的 ‘cat’,因為它處于單詞邊界位置;但不會匹配 ‘category’ 中的 ‘cat’,因為 ‘cat’ 在 ‘category’ 中不是獨立的單詞。

(四)分組和捕獲

( ):用于分組和捕獲。將正則表達式的一部分括起來,就可以把這部分當作一個整體進行操作,同時還能捕獲匹配到的內容。例如,‘(ab)+’ 可以匹配 ‘ab’、‘abab’、‘ababab’ 等,并且每次匹配到的 ‘ab’ 都會被捕獲,方便后續對分組內容進行處理。

\n:用于引用之前捕獲的分組。其中 n 是分組的編號,從 1 開始。例如,‘(a (b))\1’ 可以匹配 ‘abab’,這里的 \1 引用了第一個分組 (a (b)) 匹配到的內容,在需要重復使用之前捕獲內容進行匹配時非常實用。

三、Oracle 正則表達式函數

(一)REGEXP_LIKE 函數

功能:主要用于判斷一個字符串是否匹配指定的正則表達式模式,返回布爾值,方便在數據篩選時進行條件判斷。

語法:REGEXP_LIKE(source_string, pattern [, match_parameter])

source_string:待匹配的源字符串,是我們要處理的數據對象。

pattern:定義的正則表達式模式,用于描述匹配規則。

match_parameter:可選參數,用于指定匹配模式,例如 ‘i’ 表示不區分大小寫匹配,在處理不關心大小寫的數據匹配時使用。

示例

判斷一個字符串是否為有效的郵箱地址。

SELECT *
FROM your_table
WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

在這個示例中,正則表達式 ‘^[A-Za-z0-9._%±]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$’ 詳細定義了郵箱地址的格式。它要求郵箱地址以字母、數字、下劃線、百分號、加號、減號、點號中的一個或多個字符開頭,接著是 ‘@’ 符號,然后是由字母、數字、點號、減號組成的一個或多個字符,最后是一個點號和至少兩個字母組成的頂級域名。通過這個函數和正則表達式,能夠快速篩選出符合郵箱格式的數據。

(二)REGEXP_REPLACE 函數

功能:在一個字符串中查找匹配正則表達式模式的部分,并將其替換為指定的字符串,常用于數據清洗和格式統一。

語法:REGEXP_REPLACE(source_string, pattern [, replace_string [, position [, occurrence [, match_parameter]]]])

source_string:進行替換操作的源字符串,是要被修改的數據。

pattern:用于查找匹配內容的正則表達式模式。

replace_string:用于替換匹配部分的目標字符串。

position:可選參數,指定從源字符串的第幾個字符開始進行匹配,默認值為 1。

occurrence:可選參數,指定要替換的第幾次出現的匹配部分,默認值為 0,表示替換所有匹配部分。

match_parameter:可選參數,用于指定匹配模式,如 ‘i’ 表示不區分大小寫匹配。

示例

將字符串中的所有數字替換為 ‘#’。

SELECT REGEXP_REPLACE('abc123def456', '\d', '#')
FROM dual;

執行結果為 ‘abc###def###’,正則表達式 ‘\d’ 精準匹配所有數字字符,然后將其替換為 ‘#’,實現了數據的格式轉換。

(三)REGEXP_SUBSTR 函數

功能:從一個字符串中提取匹配正則表達式模式的子字符串,在數據提取和分析中經常使用。

語法:REGEXP_SUBSTR(source_string, pattern [, position [, occurrence [, match_parameter]]])

source_string:進行提取操作的源字符串,是數據來源。

pattern:定義提取規則的正則表達式模式。

position:可選參數,指定從源字符串的第幾個字符開始進行匹配,默認值為 1。

occurrence:可選參數,指定要提取的第幾次出現的匹配部分,默認值為 1。

match_parameter:可選參數,用于指定匹配模式,如 ‘i’ 表示不區分大小寫匹配。

示例

從一個包含多個郵箱地址的字符串中提取第一個郵箱地址。

SELECT REGEXP_SUBSTR('user1@example.com;user2@example.net', '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}')
FROM dual;

執行結果為 ‘user1@example.com’,正則表達式 ‘[A-Za-z0-9._%±]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}’ 匹配郵箱地址格式,然后成功提取出第一個匹配到的郵箱地址。

四、實際應用場景

(一)數據清洗

在數據入庫之前,確保數據的準確性和一致性至關重要。例如,統一電話號碼格式。

-- 將電話號碼格式統一為 (xxx) xxx-xxxx
UPDATE your_table
SET phone_number = REGEXP_REPLACE(phone_number, '(\d{3})(\d{3})(\d{4})', '(\1) \2-\3');

通過這個操作,能將各種不同格式的電話號碼統一成規范的格式,方便后續的數據存儲和使用。

(二)數據驗證

當用戶輸入數據時,需要驗證數據是否符合指定格式。例如,驗證身份證號碼。

SELECT *
FROM user_info
WHERE REGEXP_LIKE(id_card_number, '^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$');

利用這個正則表達式,可以快速篩選出符合身份證號碼格式的數據,避免錯誤數據進入系統。

(三)文本分析

在進行文本分析時,提取特定信息是常見需求。例如,從一篇文章中提取所有的 URL 鏈接。

SELECT REGEXP_SUBSTR(article_content, 'https?://[^\s]+', 1, level) AS url
FROM your_table
CONNECT BY LEVEL <= REGEXP_COUNT(article_content, 'https?://[^\s]+');

通過這個查詢,可以將文章中所有的 URL 鏈接提取出來,為后續的文本分析和數據挖掘提供支持。

五、注意事項

性能問題:正則表達式在處理大量數據時,可能會因為復雜的匹配規則而導致性能下降。因此,在使用時務必謹慎評估,建議先對數據進行適當過濾,減少需要處理的數據量,以提高處理效率。

字符集問題:不同的字符集可能會對正則表達式的匹配結果產生影響。在實際應用中,要確保數據庫字符集與處理數據的字符集一致,避免因字符集差異導致匹配錯誤。

正則表達式的復雜性:復雜的正則表達式雖然功能強大,但往往難以理解和維護。在編寫正則表達式時,應盡量保持簡潔明了,確保代碼的可讀性和可維護性。

六、總結

Oracle 正則表達式是數據庫開發和管理中不可或缺的強大工具,它為我們在處理和分析文本數據時提供了極大的便利。通過深入掌握正則表達式的基本語法和常用函數,我們能夠高效地實現數據清洗、驗證、分析等關鍵任務。在實際應用中,要根據具體需求合理運用正則表達式,并充分考慮性能、字符集等相關問題。希望本文能幫助讀者全面理解和熟練運用 Oracle 正則表達式,提升在數據庫領域的技術能力和工作效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用python寫一個聊天室程序

下面是一個簡單的基于Socket的Python聊天室程序示例&#xff0c;包括服務器端和客戶端&#xff1a; 服務器端代碼&#xff1a; import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…

在nodejs中使用RabbitMQ(六)sharding消息分片

RabbitMQ 的分片插件&#xff08;rabbitmq_sharding&#xff09;允許將消息分布到多個隊列中&#xff0c;這在消息量很大或處理速度要求高的情況下非常有用。分片功能通過將消息拆分到多個隊列中來平衡負載&#xff0c;從而提升消息處理的吞吐量和可靠性。它能夠在多個隊列之間…

1.7 AI智能體實戰指南:從單任務自動化到企業級智能體集群架構

AI智能體實戰指南:從單任務自動化到企業級智能體集群架構 一、智能體技術演進:從腳本工具到認知革命的跨越 1.1 三代智能體能力對比 能力維度第一代(規則驅動)第二代(機器學習)第三代(LLM驅動)任務理解固定模式匹配統計模式識別語義推理與邏輯鏈分解環境適應需人工重寫…

Github 2025-02-14 Java開源項目日報 Top10

根據Github Trendings的統計,今日(2025-02-14統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Java項目10C#項目1Guava: 谷歌Java核心庫 創建周期:3725 天開發語言:Java協議類型:Apache License 2.0Star數量:49867 個Fork數量:10822 次…

C++17中的clamp函數

一、std::clamp() 其實在前面簡單介紹過這個函數&#xff0c;但當時只是一個集中的說明&#xff0c;為了更好的理解std::clamp的應用&#xff0c;本篇再詳細進行闡述一次。std::clamp在C17中其定義的方式為&#xff1a; template< class T > constexpr const T& cl…

WEB安全--SQL注入--常見的注入手段

一、聯表查詢&#xff1a; 1.1原理&#xff1a; 當payload參數被后端查詢語句接收到時&#xff0c;其中的非法語句通過union關聯顯示出其他的數據 1.2示例&#xff1a; #payload: -1 and union select 1,2,database()--#query: $sqlselect * from users where id-1 and union …

QT筆記——QPlainTextEdit

文章目錄 1、概要2、文本設計2.1、設置文本2.1、字體樣式&#xff08;大小、下劃線、加粗、斜體&#xff09; 1、概要 QPlainTextEdit 是 Qt 框架中用于處理純文本編輯的控件&#xff0c;具有輕量級和高效的特點&#xff0c;以下是它常見的應用場景&#xff1a; 文本編輯器&am…

【D2】神經網絡初步學習

總結&#xff1a;學習了 PyTorch 中的基本概念和常用功能&#xff0c;張量&#xff08;Tensor&#xff09;的操作、自動微分&#xff08;Autograd&#xff09;、正向傳播、反向傳播。通過了解認識LeNet 模型&#xff0c;定義神經網絡類&#xff0c;熟悉卷積神經網絡的基本結構和…

DeepSeek處理自有業務的案例:讓AI給你寫一份小眾編輯器(EverEdit)的語法著色文件

1 DeepSeek處理自有業務的案例&#xff1a;讓AI給你寫一份小眾編輯器(EverEdit)的語法著色文件 1.1 背景 AI能力再強&#xff0c;如果不能在企業的自有業務上產生助益&#xff0c;那基本也是一無是處。將企業的自有業務上傳到線上訓練&#xff0c;那是腦子進水的做法&#xff…

DeepSeek教unity------MessagePack-05

動態反序列化 當調用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 時&#xff0c;二進制數據中存在的任何值都將被轉換為基本值&#xff0c;即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…

C++入門之《拷貝構造函數》詳解

拷貝構造函數是構造函數的一個重載 拷貝構造函數是特殊的構造函數&#xff0c;用于基于已存在對象創建新對象。比如定義一個 Person 類&#xff1a; class Person { private:std::string name;int age; public:Person(const std::string& n, int a) : name(n), age(a…

Ollama命令使用指南

Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概覽2. Ollama 命令詳解2.1 啟動 Ollama2.2 創建模型2.3 查看模型信息2.4 運行模型2.5 停止運行的模型2.6 從注冊表拉取模型2.7 推送模型到注冊表2.8 列出本地模型2.9 查看正在運行的模型2.10 復制模型2.11 刪除模型 3. …

為什么配置Redis時候要序列化配置呢

序列化和反序列化&#xff1f;&#xff1a; 序列化&#xff1a;將對象轉換為二進制數據&#xff0c;以便存儲到Redis中。 反序列化&#xff1a;將Redis中的二進制數據轉換回對象&#xff0c;以便在應用程序中使用。 1. 默認序列化器的問題 如果不配置序列化器&#xff0c;Re…

【問】強學如何支持 遷移學習呢?

案例&#xff1a;從CartPole-v1遷移到MountainCar-v0 在源環境&#xff08;CartPole-v1&#xff09;中訓練模型 首先&#xff0c;我們使用DQN算法在CartPole-v1環境中訓練一個強化學習模型。以下是代碼示例&#xff1a; import gym import torch import torch.nn as nn impor…

深入淺出Java反射:掌握動態編程的藝術

小程一言反射何為反射反射核心類反射的基本使用獲取Class對象創建對象調用方法訪問字段 示例程序應用場景優缺點分析優點缺點 注意 再深入一些反射與泛型反射與注解反射與動態代理反射與類加載器 結語 小程一言 本專欄是對Java知識點的總結。在學習Java的過程中&#xff0c;學習…

【算法與數據結構】并查集詳解+題目

目錄 一&#xff0c;什么是并查集 二&#xff0c;并查集的結構 三&#xff0c;并查集的代碼實現 1&#xff0c;并查集的大致結構和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;優化 小結&#xff1a; 四&#xff0c;并查集的應用場景 省份…

C語言簡單練習題

文章目錄 練習題一、計算n的階乘bool類型 二、計算1!2!3!...10!三、計算數組arr中的元素個數二分法查找 四、動態打印字符Sleep()ms延時函數system("cls")清屏函數 五、模擬用戶登錄strcmp()函數 六、猜數字小游戲產生一個隨機數randsrandRAND_MAX時間戳time() 示例 …

ShenNiusModularity項目源碼學習(8:數據庫操作)

ShenNiusModularity項目使用SqlSugar操作數據庫。在ShenNius.Repository項目中定義了ServiceCollectionExtensions.AddSqlsugarSetup函數注冊SqlSugar服務&#xff0c;并在ShenNius.Admin.API項目的ShenniusAdminApiModule.OnConfigureServices函數中調用&#xff0c;SqlSugar所…

MATLAB圖像處理:圖像特征概念及提取方法HOG、SIFT

圖像特征是計算機視覺中用于描述圖像內容的關鍵信息&#xff0c;其提取質量直接影響后續的目標檢測、分類和匹配等任務性能。本文將系統解析 全局與局部特征的核心概念&#xff0c;深入講解 HOG&#xff08;方向梯度直方圖&#xff09;與SIFT&#xff08;尺度不變特征變換&…

java枚舉類型的查找

AllArgsConstructor Getter public enum FileFilterRangeEnum {FILE_NAME("文件名稱","fileName"),FILE_CONTENT("文件內容","fileContent");private final String text;private final String value;// 根據傳入的字符串值查找對應的枚…