中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Oracle 正則表達式

Oracle 正則表達式  

正則表達式具有強大、便捷、高效的文本處理功能。能夠添加、刪除、分析、疊加、插
入和修整各種類型的文本和數(shù)據(jù)。Oracle 從 10g 開始支持正則表達式。
下面通過一些例子來說明使用正則表達式來處理一些工作中常見的問題。
1.  REGEXP_SUBSTR
REGEXP_SUBSTR 函數(shù)使用正則表達式來指定返回串的起點和終點,返回與 source_string 
字符集中的 VARCHAR2 或 CLOB 數(shù)據(jù)相同的字符串。
語法:
--1.REGEXP_SUBSTR 與 SUBSTR 函數(shù)相同,返回截取的子字符串
REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]])
注:
   srcstr          源字符串
   pattern         正則表達式樣式
   position        開始匹配字符位置
   occurrence      匹配出現(xiàn)次數(shù)
   match_option    匹配選項(區(qū)分大小寫)

 
1.1 從字符串中截取子字符串 
SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual;
Output: 1PSN
[[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符。
 
SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual;
Output: 231

與上面一個例子相比,多了兩個參數(shù)
1   表示從源字符串的第一個字符開始查找匹配
2   表示第2次匹配到的字符串(默認值是“1”,如上例)
 
select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;
Output: 231

@* 表示匹配0個或者多個@
[[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符
注意:需要區(qū)別“+”和“*”的區(qū)別
 
select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;
Output: @

@+ 表示匹配1個或者多個@
[[:alnum:]]* 表示匹配0個或者多個字母或數(shù)字字符
 
select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;
Output: Null

@+ 表示匹配1個或者多個@
[[:alnum:]]+ 表示匹配1個或者多個字母或數(shù)字字符
 
select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;
Output: 125

[[:digit:]]+$ 表示匹配1個或者多個數(shù)字結(jié)尾的字符
 
select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$) from dual;
Output: /ABc

[^[:digit:]]+$ 表示匹配1個或者多個不是數(shù)字結(jié)尾的字符
 
select regexp_substr('Tom_Kyte@oracle.com','[^@]+
) from dual;
Output: Tom_Kyte
[^@]+ 表示匹配1個或者多個不是“@”的字符
 
select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) 
from dual;
Output: Null

[[:alnum:]]* 表示匹配0個或者多個字母或者數(shù)字字符
注:因為是匹配0個或者多個,所以這里第2次匹配的是“/”(匹配了0次),而不是“231”,
所以結(jié)果是“Null”
1.2 匹配重復(fù)出現(xiàn) 
查找連續(xù) 2 個小寫字母
SELECT regexp_substr('Republicc Of Africaa', '([a-z])\1', 1, 1, 'i')
  FROM dual;
Output: cc

([a-z])   表示小寫字母a-z
\1         表示匹配前面的字符的連續(xù)次數(shù)
1          表示從源字符串的第一個字符開始匹配
1          第一次出現(xiàn)符合匹配結(jié)果的字符
i          表示區(qū)分大小寫
查找連續(xù) 3 個 6,7,8,9 中的數(shù)字
SELECT CASE
         WHEN regexp_like('Patch 10888 applied', '([6-9])\1\1') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

1.3 其他一些匹配樣式 
查找網(wǎng)頁地址信息
SELECT regexp_substr('Go to http://www.oracle.com/products and click on database',
'http://([[:alnum:]]+\.?){3,4}/?') RESULT
  FROM dual
Output: http://www.oracle.com

其中:
http://             表示匹配字符串“http://”
([[:alnum:]]+\.?) 表示匹配1次或者多次字母或數(shù)字字符,緊跟0次或1次逗號符
{3,4}               表示匹配前面的字符最少3次,最多4次
/?                  表示匹配一個反斜杠字符0次或者1次
提取 csv 字符串中的第三個值
SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, 3) AS output
  FROM dual;
Output: Japan

其中:
[^,]+    表示匹配1個或者多個不是逗號的字符
1         表示從源字符串的第一個字符開始查找匹配
3         表示第3次匹配到的字符串
注:這個通常用來實現(xiàn)字符串的列傳行
--字符串的列傳行
SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, LEVEL) AS output
  FROM dual
CONNECT BY LEVEL <= length('1101,Yokohama,Japan,1.5.105') -
           length(REPLACE('1101,Yokohama,Japan,1.5.105', ',')) + 1;
Output: 1101
        Yokohama
Japan
1.5.105

這里通過 LEVEL 來循環(huán)截取匹配到的字符串。
下面這個例子,查找源字符串中是否包含 kid 、kids 或者 kidding 這三個字符串
SELECT CASE
         WHEN regexp_like('Why does a kid enjoy kidding with kids only?',
                          'kid(s|ding)*',
                          'i') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

其中:
kid          表示字符串kid
(s|ding)*  表示匹配0次或者多次字符“s”或者“ding”
i            表示不區(qū)分大小寫
2.  REGEXP_INSTR 
REGEXP_INSTR 函數(shù)使用正則表達式返回搜索模式的起點和終點。REGEXP_INSTR
的語法如下所示。REGEXP_INSTR 返回一個整數(shù),指出搜索模式的開始或結(jié)束的位置,如
果沒有發(fā)現(xiàn)匹配的值,則返回 0。
語法:
--2.REGEXP_INSTR 與 INSTR 函數(shù)相同,返回字符串位置
REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]])
與 REGEXP_SUBSTR 一樣,它也有變量 pattern、 position(開始位置 )、
occurrence 和 match_parameter;這里主要介紹一下新參數(shù) return_option 的作
用,它允許用戶告訴 Oracle,模式出現(xiàn)的時候,要返回什么內(nèi)容。
具體如下面的例子所示:
--如果 return_option 為 0 則,Oracle 返回第一個字符出現(xiàn)的位置。這是默認值,與 INSTR 的作用相同
SELECT regexp_instr('abc1def',
                    '[[:digit:]]') output
  FROM dual;
Output: 4

 
--如果 return_option 為 1,則 Oracle 返回跟在所搜索字符出現(xiàn)以后下一個字符的位置。
--例如,下面的查詢返回了在串中發(fā)現(xiàn)的第一個數(shù)字的位置:
SELECT regexp_instr('abc1def',
                    '[[:digit:]]',1,1,1) output
  FROM dual;
Output: 5

3.  REGEXP_LIKE 
除了上面列出的正則表達式函數(shù),還可以使用 REGEXP_LIKE 函數(shù)。REGEXP_LIKE 支
持在 where 子句中使用正則表達式。
語法:
--3.REGEXP_LIKE 與 LIKE 函數(shù)相同,返回布爾類型
REGEXP_LIKE(srcstr, pattern [,match_option])
3.1 驗證字符串全部由字母組成 
SELECT CASE
         WHEN regexp_like('Google', '^[[:alpha:]]{6}$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

在上面這個例子中,通過正則表達式來驗證字符串是否由 6 個字母組成。解釋一下表
達式 ^[[:alpha:]]{6}$。
^              表示行的開始
[[:alpha:]]  表示字母
{6}            表示匹配的次數(shù),這里表示匹配6次
$              表示行的結(jié)尾
3.2 驗證字符串全部由小寫字母組成 
SELECT CASE
         WHEN regexp_like('Terminator', '^([[:lower:]]{3,12})$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

這里如果我們把輸入字符串改成“terminator”,則結(jié)果就是匹配了。上面的例子中,
通過正則表達式來驗證字符串是否由 3 到 12 個小寫字母組成。其中:
{3,12}   表示匹配次數(shù),最少3次,最多12次
3.3 區(qū)分大小寫 
SELECT CASE
         WHEN regexp_like('Republic Of India', 'of', 'c') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: No Match Found

上面的例子中,通過正則表達式來驗證字符串是否包含小寫的“of”。其中:
c    表示完全匹配,區(qū)分大小寫
如果改成下面這樣,則不區(qū)分大小寫:
SELECT CASE
         WHEN regexp_like('Republic Of India', 'of', 'i') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

其中:
i    表示不區(qū)分大小寫
3.4 匹配第n 位置的字符 
SELECT CASE
         WHEN regexp_like('ter*minator', '^...[^[:alnum:]]') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found

在上面的例子中,通過正則表達式來驗證字符串“ter*minatory”的第 4 位的字符。
解釋一下表達式^...[^[:alnum:]],其中:
^              表示行的開始
.              表示匹配任意一個的字符(… 表示3個任意的字符)
[^[:alnum:]] 表示匹配不是字母和數(shù)字(^ 在方括號內(nèi),表示否定)
3.5 查找控制字符
SELECT CASE
         WHEN regexp_like(
'^([[:alnum:]]+(_?|\.))[[:alnum:]]*@[[:alnum:]]+(\.([[:alnum:]]+)){1,2}$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END AS output
  FROM dual;
Output: Match Found
將上面的正則表達式通過字符“@”分為兩部分:
前半部分 ^([[:alnum:]]+(_?|\.))[[:alnum:]]* ,其中:
^       表示行的開始
([[:alnum:]]+(_?|\.)) 表示匹配以1個或多個字符或者數(shù)字字符,緊跟著字符“
或者字符“.”
_”
[[:alnum:]]* 表示匹配0個或者多個字母或者數(shù)字字符
后半部分 [[:alnum:]]+(\.([[:alnum:]]+)){1,2}$,其中:
[[:alnum:]]+ 表示匹配1個或者多個字母或者數(shù)字字符
(\.([[:alnum:]]+)){1,2} 表示匹配1個或者2個,“.”加上1個或者多個字母或
者數(shù)字字符(例如:.com.cn 或者 .co.in)
$       表示行的結(jié)尾
 
輸入:tom.kyte@oracle.com
輸出:Match Found
 
輸入:tom-kyte@oracle.com
輸出:No Match Found
 
注:上面出現(xiàn)的“\.”中“\”表示轉(zhuǎn)義符,因為“”是關(guān)鍵字符,匹配任意字符,所以需要轉(zhuǎn)
義符。
 
4.  REGEXP_REPLACE 
REGEXP_REPLACE 函數(shù)是用另外一個值來替代串中的某個值。例如,可以用一個匹配
數(shù)字來替代字母的每一次出現(xiàn)。REGEXP_REPLACE 的格式如下所示
語法:
--4.REGEXP_REPLACE 與 REPLACE 函數(shù)相同,替換原字符串中的字符內(nèi)容
REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]])
4.1 查找替換空格符
SELECT regexp_replace('Help Earth Stay Green', '[[:blank:]]{2,8}', ' ')
  FROM dual;
Output: Help Earth Stay Green
上面的例子中,用正則表達式將字符串中多個空格替換為一個空格。其中:
[[:blank:]]{2,8}  表示2到8個空格
注:這里有目的的沒有包含(^$) 元字符,是因為需要匹配字符串中的任何位置,所以不需
要這兩個位置匹配符。^[[:blank:]]{2,8}$ 這樣表示字符串中只包含2-8個空格
4.2 格式化字符串 
SELECT regexp_replace('04099661234',                     
'([[:digit:]]{3})([[:digit:]]{4})([[:digit:]]{4})',
                      '(\1) \2-\3') AS formatted_phone
  FROM dual;
Output: (040) 9966-1234

([[:digit:]]{3}) 表示3個數(shù)字   ---?  \1
([[:digit:]]{4}) 表示4個數(shù)字   ---?  \2
([[:digit:]]{4}) 表示4個數(shù)字   ---?  \3
所以 “(\1) \2-\3” 表示將前3個數(shù)字用圓括號,緊跟著一個空格,再跟著中間4個數(shù)據(jù),
再跟著連字符“-”,最后是后4位的數(shù)字。
 
更多格式化字符串的例子
SELECT regexp_replace('04099661234',                     
'^([[:digit:]]{1})([[:digit:]]{2})([[:digit:]]{4})([[:digit:]]{4})$',
                      '+91-\2-\3-\4') AS formatted_phone
  FROM dual;
Output: +91-40-9966-1234

下面一個例子中,在每兩個字符之間插入一個空格符
SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM dual;
Output: Y A H O O

5.  附注: 
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle正則表達式規(guī)則
Oracle正則表達式的用法
oracle PL/SQL使用更方便了——Oracle10g的SQL正則表達式支持[天源迪科論壇]
在 Oracle 中使用正則表達式
Oracle正則表達式函數(shù)
mysql 正則表達式手冊
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服