1. 程式人生 > >Oracle中的正則表示式(及函式)詳解

Oracle中的正則表示式(及函式)詳解

1、概述

    相信大家對正則表示式都不陌生,從linux下的命令到Java等程式語言,正則表示式無處不在,雖然我們實際使用的時候也並不一定太多,但是當我們要處理字串時,它確實是一個強大的工具。

    上一篇文章(Oracle中的字串型別及相關函式詳解)中,已經介紹了一些串相關的函式,也列出了用於正則表示式的函式,本文就正式介紹他們。

    本文基於Oracle 12c ,可能部分內容在較老的版本中不適用。

    運算子

    在介紹函式前,這裡先說明一下Oracle中正則表示式運算子及其描述。

    如果不知道他們有什麼用,或者也不知道描述說的是什麼,沒關係,可以先看後面的介紹,就知道他們的含義了。

運算子

    合理的使用這些運算子,配合正則表示式相關的函式,不但可以讓字串處理變得更加高效,還能大大的減少程式碼量。

2、相關函式

    統一說明: 

        函式中pattern為正則表示式,最多可以包含512個位元組。

        下面的介紹中,及時是不同的函式,如若引數描述字串相同,即他們的意思也是相同的(如regexp_substr函式和regexp_instr函式中的position意思都是表示開始搜尋的位置),為了內容緊湊,只在那個引數第一次出現的地方作介紹。

        引數帶char的表示簡單的串型別,帶string的可以包含大物件串型別(如clob)。

        慣例,“[]”表示可選引數。

    2.1、REGEXP_SUBSTR

    REGEXP_SUBSTR函式使用正則表示式來指定返回串的起點和終點。

    語法:

  1. regexp_substr(source_string,pattern[,position[,occurrence[,match_parameter]]])

    source_string:源串,可以是常量,也可以是某個值型別為串的列。

    position:從源串開始搜尋的位置。預設為1。

    occurrence:指定源串中的第幾次出現。預設值1.

    match_parameter:文字量,進一步訂製搜尋,取值如下:

  •     'i'     用於不區分大小寫的匹配。
  •     'c'    用於區分大小寫的匹配。
  •     'n'    允許將句點“.”作為萬用字元來匹配換行符。如果省略改引數,句點將不匹配換行符。
  •     'm'   將源串視為多行。即將“^”和“$”分別看做源串中任意位置任意行的開始和結束,而不是看作整個源串的開始或結束。如果省略該引數,源串將被看作一行來處理。
  •     如果取值不屬於上述中的某個,將會報錯。如果指定了多個互相矛盾的值,將使用最後一個值。如'ic'會被當做'c'處理。
  •     省略該引數時:預設區分大小寫、句點不匹配換行符、源串被看作一行。

    例1:

  1. select regexp_substr('MY INFO: Anxpp,22,and boy','my',1,1,'i')from users;

    將返回MY,如果將match_parameter改為'c'將不反悔任何內容(null)。

    例2:

  1. select regexp_substr('MY INFO: Anxpp,23,and boy','[[:digit:]]',1,2)from users;

    此處會返回3。

    注意這裡同時用到了“[]”和“[:digit:]”。

    2.2、REGEXP_INSTR

    REGEXP_INSTR函式使用正則表示式返回搜尋模式的起點和終點(整數)。如果沒有發現匹配的值,將返回0。

    語法:

  1. regexp_instr(source_string,pattern[,position[,occurrence[,return_option[,match_parameter]]]])

    return_option:為0時,返回第一個字元出現的位置,與instr作用相同。為1時,返回所搜尋字元出現以後下一個字元的位置。預設為0。

    例1:

  1. select regexp_instr('MY INFO: Anxpp,23,and boy','[[:digit:]]')from users;

    該例會返回16。

    REGEXP_INSTR函式常常會被用到where子句中。

    2.3、REGEXP_LIKE

    通常使用REGEXP_LIKE進行模糊匹配。

    語法:

  1. regexp_like(source_string,pattern[match_parameter])

    比如,查詢電話好嗎以666開頭的:

  1. select name from users where regexp_like(phone,'666');

    例1:

  1. select*from users where regexp_like('MY INFO: Anxpp,23,and boy','[[:digit:]]');

    此例判斷串中是否包含數字。

    該函式可以使用前面介紹的所有搜尋功能作為REGEXP_LIKE搜尋的一部分,可以是非常複雜的搜尋變得簡單。

    2.4、REPLACE和REGEXP_REPLACE

    REPLACE函式用於替換串中的某個值。

    語法:

  1. replace(char,search_string[,replace_string])

     如果不指定replace_string,會將搜尋到的值刪除。

    輸入可以是任何字元資料型別:char,varchar2,nchar,nchar,nvarchar2,clob或nclob。

    例1:

  1. select replace('MY INFO: Anxpp,23,and boy','an')from users;

    返回:MY INFO: Anxpp,23,d boy

    下面演示使用該函式計算某字串在源串中出現的次數:

  1. select(length('MY INFO: Anxpp,23,and boy')-length(replace('MY INFO: Anxpp,23,and boy','an')))/length('an')from users;

    REGEXP_REPLACE是REPLACE的增強版,支援正則表示式,擴充套件了一些功能。

    語法:

  1. regexp_replace(source_string,pattern[,replace_string[,position[,occurrence[,match_parameter]]]])

    replace_string表示用什麼來替換source_string中與pattern匹配的部分。

    occurrence為非負整數,0表示所有匹配項都被替換,為正數時替換第n次匹配。

    其他引數在前面都已經介紹過了。

    例1:

    想象這樣一個場景:有一個分散式的爬蟲,負責抓取網頁的程式已經將資料存入資料庫,而當前負責處理的程式需要從其中讀取其中的一些資料,包括電話號碼。號碼一般是11為,前3位區號,中間4位表示交換機,再加上後面4位,格式也不能確定,我們可以試著用下面的SQL來讀取,生成我們想要的格式:

  1. select regexp_replace('電話:023 5868-8888 郵箱:[email protected]',
  2. '.*([[:digit:]]{3})([^[:digit:]]{0,2})([[:digit:]]{4})([^[:digit:]]{0,2})([[:digit:]]{4}).*',
  3. '(\1)\3\5'
  4. ) phone from users;

    該例返回:(023)58688888

    "\1"、“\3”、“\5”分別表示第1、3、5個數據集。其他的,大家慢慢看就能看懂了。

    配合where子句,可以限制要返回的行。

    2.5、REGEXP_COUNT

    REGEXP_COUNT函式返回在源串中出現的模式的次數,作為對REGEXP_INSTR函式的補充。

    雖然COUNT是一個集合函式,操作的是行組,但是REGEXP_COUNT是單行函式,分別計算每一行。

    語法:

  1. regexp_count(source_char,pattern[,position[,match_param]])

    REGEXP_COUNT返回pattern在source_char串中出現的次數。如果未找到匹配,函式返回0。

    metch_param引數,相對於前面介紹的match_parameter引數多一個取值“x”。

    'x':忽略空格字元。預設情況下,空格與自身想匹配。

    metch_param如果指定了多個互相矛盾的值,將使用最後一個值。

    前面介紹了使用replace函式統計字串在源串中出現的次數,這裡可以使用REGEXP_COUNT實現,而且看起來更簡單:

  1. select regexp_count('MY INFO: Anxpp,23,and boy','an')from users;

    返回:1

    此處還是使用match_param引數進行不區分大小寫搜尋:

  1. select regexp_count('MY INFO: Anxpp,23,and boy','an',1,'i')from users;

    返回:2

3、總結

    以上正則表示式相關函式的使用,主要體現在對正則表示式的掌握程度上,如果精通了正則表示式,一些非常複雜的串處理,也能用比較簡潔的程式碼完成。

相關推薦

Oracle表示式(函式)

1、概述     相信大家對正則表示式都不陌生,從linux下的命令到Java等程式語言,正則表示式無處不在,雖然我們實際使用的時候也並不一定太多,但是當我們要處理字串時,它確實是一個強大的工具。     上一篇文章(Oracle中的字串型別及相關函式詳解)中,已

JDK表示式類庫(一)

二、以下是自己對正則表示式的一些理解。    [size=medium]1. 正則表示式規則1.1 普通字元    字母、數字、漢字、下劃線、以及後邊章節中沒有特殊定義的標點符號,都是"普通字元"。表示式中的普通字元,在匹配一個字串的時候,匹配與之相同的一個字元。    舉例1:表示式 "c",在匹配字串 "

Python表示式常用函式sub,search,findall,split等使用

1.原生字串r python中字串前面加上 r 表示原生字串,不會轉義。與大多數程式語言相同,正則表示式裡使用"\"作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元"\",那麼使用程式語言表示的正則表示式裡將需要4個反斜槓"\\":前兩個和後兩個分別用於在程式語言裡轉義成反斜

jsstring之表示式replace方法

本篇文章主要介紹了js中string之正則表示式replace方法詳解,replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物件的方法。 replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物

PHP表示式 模式引數

i (PCRE_CASELESS)  如果設定此修正符,模式中的字元將同時匹配大小寫字母。 m(PCRE_MULTILINE)  預設情況下,PCRE 將目標字串作為單一的一“行”字元所組成的(甚至其中包含有換行符也是如此)。“行起始”元字元(^)僅僅匹配字串的起始

golang表示式的使用

正則表示式是一種進行模式匹配和文字操縱的功能強大的工具。正則表示式靈活、易用,按照它的語法規則,隨需構造出的匹配模式就能夠從原始文字中篩選出幾乎任何你想要得到的字元組合。使用正則表示式需引入"regexp"包,通常還需與"strings"包配合使用,推薦一篇《Go strings 字串處理包

notepad++表示式替換字串

正則表示式是一個查詢的字串,它包含一般的字元和一些特殊的字元,特殊字元可以擴充套件查詢字串的能力,正則表示式在查詢和替換字串的作用不可忽視,它 能很好提高工作效率。 EditPlus的查詢,替換,檔案中查詢支援以下的正則表示式: 表示式 說明 /t 製表符.

JS表示式最基本的判斷手機號,郵箱,身份證

    首先最基本的符號型別及含義整理一下。     1,最基本的符號:^  $  *  +  ?         ^    代表字串的開始位置 &nbs

php 表示式

概述 正則表示式是一種描述字串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、擷取匹配的字串。常用的語言基本上都有正則表示式,如JavaScript、java等。其實,只有瞭解一種語言的正則使用,其他語言的正則使用起來,就相對簡單些。文字主要圍繞解決下面問題展開。 有哪些常用的

Pythonre(表示式)常用函式總結

1  re.match       #嘗試從字串的開始匹配一個模式     re.match的函式原型為:re.match(pattern, string, flags)     第一個引數是正則表示式,這裡為"(\w+)\s",如果匹配成功,則返回一個Match,否則返

Python表示式match函式的用法

正則表示式(Regular Expression)是使用單個字串來描述、匹配一系列語法規則的字串。簡稱RE。 RE是爬蟲的基礎模組,可以用於驗證電話號碼,身份證號,郵箱,使用者名稱和密碼,url地址等。 操作步驟 呼叫re模組(python內嵌的包) i

shell指令碼之表示式函式、grep、sed、awk、printf等基本命令配置

一、正則表示式 簡介: 正則表示式(或稱Regular Expression,簡稱RE)就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進

Jmeter表示式提取器使用

在使用Jmeter過程中,會經常使用到正則表示式提取器提取器,雖然並不直接涉及到請求的測試,但是對於資料的傳遞起著很大的作用,本篇博文就是主要講解關於正則表示式及其在Jmeter的Sampler中的呼叫。 一、首先來介紹一下J meter中正則表示式提取器的元素組成,下圖所示: 下面是各引數值的含義:

JavaScript表示式常見使用函式

最近越來越感覺到正則表示式的強大,可以簡化很多程式碼。並且正則表示式入門並不是很難。簡單列一下JavaScript中使用正則表示式的一些方法。 //定義幾個會用到的變數 var href = 'bai

Javascript表示式的使用

正則表示式用來處理字串特別好用,在JavaScript中能用到正則表示式的地方有很多,本文對正則表示式基礎知識和Javascript中正則表示式的使用做一個總結。 第一部分簡單列舉了正則表示式在JavaScript中的使用場景;第二部分詳細介紹正則表示式的基礎知識,寫出一些例子方便理解。 本文的內容是

php表示式涉及函式

元字元描述示例.匹配任意單個字元。正則表示式 a.c 可以匹配 aac,a2c,a#c 等$匹配字串的結尾。正則表示式 abc$ 可以匹配最後以 abc 結尾的字串^匹配字串的開始。正則表示式 ^what 可以匹配以 what 開始的字串*匹配 * 前面的子串零次或多次正則表

【2017-11+10】 JS表示式

在JS的開發過程中,很多時候都需要驗證表單的正確性;使用正則表示式能夠很好的簡化表單的驗證過程。 在JS中,內建了 RegExp 物件,用來進行正則匹配。 一. RegExp 物件的使用

JS利用表示式交換函式的引數位置

某百科中看到一個例子,要用正則表示式將函式foo(a,b,c)中的引數位置換為foo(b,a,c),正好又在複習JS的過程中看到了正則表示式的部分,於是考慮用JS來實現這個功能。 函式的引數同例題中一樣通過 [^,]* 進行匹配,於是寫出正則式: /foo\

python學習-表示式re模塊

我只 com 返回 現在 輸出 -1 完全匹配 group clu python中的所有正則表達式函數都在re模塊中。import re導入該模塊。 1,創建正則表達式對象 想re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象。 創建一

Python表示式re.match的用法

re.match(pattern, string, flags) 第一個引數是正則表示式,如果匹配成功,則返回一個Match,否則返回一個None; 第二個引數表示要匹配的字串; 第三個引數是標緻位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。 需要特別注意的是,這個方法並不是完