您的位置:首頁技術文章
文章詳情頁

oracle正則表達式多項匹配時相似項有優先級詳解

瀏覽:124日期:2023-09-12 20:47:51
目錄前言: 一、正則表達式用法(Regexp_Like為例)1、語法規則2、注釋3、實例二、正則表達式優先級的注意點三、解決方案擴展:1、正則表達式過長2、替換規則失效四、總結 前言:

Oracle常用正則表達式函數主要以下5個:

REGEXP_LIKE:與LIKE的功能相似;REGEXP_SUBSTR :與SUBSTR的功能相似;REGEXP_INSTR :與INSTR的功能相似;REGEXP_REPLACE :與REPLACE的功能相似;REGEXP_COUNT :與COUNT的功能相似;

常用的正則表達式匹配符有以下運算符,本文重點來闡述“|”指定多個選項,容易被忽視的問題。

一、正則表達式用法(Regexp_Like為例)

Regexp_Like()函數 模糊匹配。

1、語法規則

regexp_like(source_string,pattern[match_parameter])

2、注釋source_string:傳入的字符串,可以是常量,也可以是某個值類型為串的列;pattern:要進行匹配的字符串;match_parameter:文本量,進一步訂制搜索,取值如下:‘i’ 用于不區分大小寫的匹配。‘c’ 用于區分大小寫的匹配。‘n’ 允許將句點“.”作為通配符來匹配換行符。如果省略該參數,句點將不匹配換行符。‘m’ 將源串視為多行。即將“^”和“$”分別看做源串中任意位置任意行的開始和結束,而不是看作整個源串的開始或結束。如果省略該參數,源串將被看作一行來處理。

如果取值不屬于上述中的某個,將會報錯。如果指定了多個互相矛盾的值,將使用最后一個值。如’ic’會被當做’c’處理。省略該參數時:默認區分大小寫、句點不匹配換行符、源串被看作一行。

3、實例

代碼:

select * from (select 'ABC你好' reg from dual union select 'a233' reg from dual)where regexp_like(reg,'[0-9]','c')--匹配有數字的字符串

效果:

解析:

可以看到正則表達式,通過后面的'[0-9]'的規則來獲取我們想要的數據。

二、正則表達式優先級的注意點

當我們使用REGEXP_REPLACE將多個表達式的數據替換時,這時候我們要考慮替換規則有沒有類似項,比如REGEXP_REPLACE(reg,'-BL|-BL1')即替換掉字符串reg里面包含-BL或者-BL1的字符串,此時如果我們按這種寫法REGEXP_REPLACE(reg,'-BL|-BL1'),實際效果是只會替換掉-BL,因為oracle會按照替換規則的順序來執行,如果滿足了第一個條件,后面的就不會再去執行了,這也是為了加快了程序的處理速度,但同時也會造成我們常常忽略的問題。

好的,我們來看看下面的具體案例吧。

代碼:

select reg, REGEXP_REPLACE(reg,'-BL|-BL1')reg_replace from (select 'A_123456D-BL1' reg FROM dual)

效果:

解析:

因為正則表達式,默認會按順序執行,此時正則表達式,-BL滿足規則了,就不會執行-BL1了,因此就會得到的結果是對應的REG字符串里面替換后還會多出了一個1。

三、解決方案

現實情況下,我們往往會有很多替換規則,少則幾個,多則好幾百,如果我們用replace函數估計要嵌套幾百次,估計你會直搖頭吧,雖然regexp_replace可以一次性將多個規則寫在一起,但是我們還是要注意上述提到的優先級的問題。因此我們需要將相同的部分放到最后,如上面說到的“-BL”此時就能達到我們的需求了。

擴展:

我們來看個現實的案例。當面對168個規則時我們會遇到哪些問題。

1、正則表達式過長

解決方法:嵌套多個正則表達式 ,像竹筍一樣多疊幾層即可。

2、替換規則失效

出來的數據還是有我們不想要的數據,比如下面的三個批次,我們只想保存一條,如果我們替換規則不當就會造成,這三個字符串替換后還是不相同的,無法達到我們想要的效果。

解決辦法:我們首先將所有的替換規則用EXCEL表例好,然后排好優先級,然后再去修改正則表達式。如圖所示我們將規則列好,然后用不同顏色標示優先級。然后再整理表達式。如下圖所示小編將最小匹配項的表達式放到最后面了,這樣就能達到我們想要的效果了。

四、總結

針對復雜的數據分析,首先建議從業務角度去規范,因為雖然技術可以處理,但是歷史數據處理成本是巨大,因此一個企業的數據底座搭建,是離不開強標準化的數據治理的。

到此這篇關于oracle正則表達式多項匹配時相似項有優先級的文章就介紹到這了,更多相關oracle正則表達式多項匹配內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Oracle 數據庫
国产综合久久一区二区三区