oracle 正則表達式 匹配


oracle 正則表達式

在實際應用中,想排除帶有中文的字段值:

select h.froomnumber from t_broker_house h where REGEXP_LIKE(froomnumber,'^([a-z0-9A-Z]|-)*$')
 

字符串’^198[0-9]$’可以匹配‘1980-1989’,如果希望統計出公司那些員工是80年~89年入職的,就可以使用如下的SQL語句:

select * from emp e where regexp_like(to_char( e.hiredate,'yyyy'),'^198[0-9]$');

 

正則表達式中常用到的元數據(metacharacter)如下:

^ 匹配字符串的開頭位置。

$ 匹配支付傳的結尾位置。

* 匹配該字符前面的一個字符0次,1次或者多次出現。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。

+ 匹配該字符前面的一個字符1次或者多次出現。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等

? 匹配該字符前面的一個字符0次或1次或者多次出現。例如52?oracle 只能匹配5oracle,52oracle等等

{n} 匹配一個字符串n次,n為正整數。例如:hel{2}o 所匹配的是hello

{n,m} 匹配一個字符串至少n次,至多m次。其中n和m都是整數。

. 匹配除了null之外的任何單個字符串

(pattern) 這個是用來匹配指定模式的一個子表達式

x|y 匹配x或者y,其中x和y是一個或者多個字符

[abc] 匹配括號中的任意一個字符。例如:[ab]bc可以匹配abc和bbc

[a-z] 匹配指定范圍內的任意字符串。例如[A-G]hi可以匹配Ahi至Ghi

[::]指定一個字符類,可以匹配該類中的任意字符 這里的字符類包括:

[:alphanum:] 可以匹配字符0-9、A-Z、a-z

[:alpha:]可以匹配字符A-Z、a-z

[:blank:]可以匹配空格或者tab鍵

[:digit:]可以匹配數字 0-9

[:gragh:]可以匹配非空字符

[:punct:]可以匹配. , ” ‘等標點符號。

[:upper:]可以匹配字符A-Z

[:lower:]可以匹配字符a-z

關於orace中的正則表達式只能通過oracle特意為正則表達式設計的4個函數來使用。

這4個函數分別是:

regexp_like,regexp_instr,regexp_replace,regexp_substr。

 

 

 

 

ORACLE正則表達式函數詳解
  
ORACLE正則表達式函數詳解
 
Oracle10g提供了四個正則表達式函數regexp function: REGEXP_LIKE, REGEXP_REPLACE,REGEXP_INSTR,REGEXP_SUBSTR。
 
REGEXP_LIKE:(匹配) 比較一個字符串是否與正則表達式匹配  
    (srcstr, pattern [, match_option])  
 
REGEXP_INSTR:(包含)在字符串中查找正則表達式,並且返回匹配的位置  
    (srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])  
      
REGEXP_SUBSTR:(提取) 返回與正則表達式匹配的子字符串  
    (srcstr, pattern [, position [, occurrence [, match_option]]])   
REGEXP_REPLACE:(替換)搜索並且替換匹配的正則表達式  
    (srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])  
 
    srcstr:        被查找的字符數據。   
    pattern:       正則表達式。  
    occurrence:    出現的次數。默認為1。  
    position:      開始位置  
    return_option: 默認值為0,返回該模式的起始位置;值為1則返回符合匹配條件的下一個字符的起始位置。  
    replacestr:    用來替換匹配模式的字符串。  
    match_option:  匹配方式選項。缺省為c。  
                   c:case sensitive  
                   I:case insensitive  
                   n:(.)匹配任何字符(包括newline)  
                   m:字符串存在換行的時候被作為多行處理  
##################################################################################
正則表達式由以下標准的元字符(metacharacters)所構成:
字符
[[:alpha:]]任何字母。[A-Za-z]
[[:digit:]]任何數字。[0-9]
[[:alnum:]]任何字母和數字。[A-Za-z0-9]
[:blank:]   [ ],標准是空格和TAB,但Oracle里只有空格!
[:cntrl:]   CONTROL鍵
[:graph:]  即所有可見字符,不包括空格
[:print:]  可打印字符 ,即空格+所有可見字符
[[:space:]] 空白字符。
[[:punct:]] 任何標點符號。
[[:upper:]] 任何大寫字母。[A-Z]
[[:lower:]] 任何小寫字母。[a-z]
[[:xdigit:]]任何16進制的數字,相當於[0-9a-fA-F]。
#######
[:class:]   字符類。class如alnum、digit等。
[.element.] 整理類。受NLS_SORT影響。將多字節字符當作單字節字符看待。如在西班牙語中ch、ll都是用多字節表示的單字節。
[=char=]    等同類。在當前語言(Locale)下,匹配所有的屬於相同的POSIX等同類字符指定的字符。如在西班牙語中,[[=n=]]指定了等同類字符n,它可以匹配El Ni?o中的N和 ?.
###########################################################################
邊界符集合
^   每一行的開頭,單行模式下等價於字符串的開頭
$   每一行的結尾,單行模式下等價於字符串的結尾
在單行模式下,^和\A等價,$和\Z等價。
##########################################################################
重復次數集合
*   匹配零次或多次--盡可能多的次數
?   零次或一次
+   一次或多次
{m} {m}?正好m次,貪婪與非貪婪一樣的
{m,}    {m,}?至少m次
{m, n}  {m, n}?最少m最多n次
在上述字符后加?,如:*?,即為非貪婪模式。
貪婪模式會獲取盡可能多的字符,而非貪婪模式會獲取盡可能少的字符
###############################################################
組合操作符
[…]     方括號內任意字符或字符集合中的一個。在其中所有的操作符號都被視為普通符號,但以下除外:
★范圍操作符:- 但當"-"位於字符列表的第一個或最后一個字符時,或位於范圍的結尾時,會被當作"-"本身來看待。
當右方括號"]"出現在列表的第一個位置時,它會被當作"]"本身來處理。
[^…]    方括號內^為第一個字符時,表示與其后所有字符都不匹配的字符
(…)     圓括號,將復雜表達式當作單一表達式來處理
..|..    或
abc      和。直接將字符連在一起寫
優先級比較:圓括號>重復次數操作符>和>或。
例如,(f|ht)tps?: 表示
ftp:
ftps:
http:
https:
######################################################################
匹配操作符
\n      即后向引用。n為1~9,標識由圓括號里取得的匹配字符串。方向是從左到右。
轉義操作符
\       將其后緊跟着的操作字符當作普通字符看待。
例如 abc*def 可以匹配 abdef或abcccdef等,但無法匹配abc*def,后者需要abc\*def才能匹配
##################################################
一條正則表達式匹配函數示例解析:
SELECT * FORM tKHXX where  REGEXP_LIKE(SJHM,  '^[1]{1}[35]{1}[[:digit:]]{9}$' ) 
這個語句是從表中查手機號。
^ 表示開始
$ 表示結束 
[]內部為匹配范圍
{}里的內容表時個數
手機號碼的特點是以 1開頭接着是3或5再加9位的數字 所以這么理解
1開頭 表達式為 ^[1]{1} 意為 開始1位里包含1
3或5 表達式為 [35]{1},即第二位包含有3或5的
9位數字結束 為: [[:digit:]]{9}$ 這里[:digit:]為特殊寫法,代表為數字,再加個結束符$。即最后9位是數字。
####################################################################### 
后向引用(backreference):
后向引用是一個很有用的特性。它能夠把子表達式的匹配部分保存在臨時緩沖區中,供以后重用。緩沖區從左至右進行編號,並利用 \digit 符號進行訪問。子表達式用一組圓括號來顯示。利用后向引用可以實現較復雜的替換功能。  
下面的regexp_replace('Steven Chen', '(.*) (.*)', '\2, \1')  此函數中,首先在正則表達式函數中,('Steven Chen', '(.*) (.*)', 其中兩個圓括號中會匹配出Chen, Steven;再使用"\數字“的符號進行引用。
?
1
2
3
4
5
6
7
8
9
     SQL> select regexp_replace( 'Steven Chen' , '(.*) (.*)' , '\2, \1' ) as reversed_name from dual;       
     REVERSED_NAME 
     -------------------- 
     Chen, Steven 
在DDL中也可以正則表達式,比如 Constraint , index , view
Sql代碼 
     SQL> alter table person add constraint constraint_zip check (regexp_like(zip, '^[[:digit:]]+$' )); 
       
     SQL> create index person_idx on person(regexp_substr(last_name, '^[[:upper:]]' ));

 

 

http://blog.sina.com.cn/s/blog_69e7b8d701012tuj.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM