在實際應用中,想排除帶有中文的字段值:
字符串’^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 sensitiveI:case insensitiven:(.)匹配任何字符(包括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位里包含13或5 表達式為 [35]{1},即第二位包含有3或5的9位數字結束 為: [[:digit:]]{9}$ 這里[:digit:]為特殊寫法,代表為數字,再加個結束符$。即最后9位是數字。#######################################################################后向引用(backreference):后向引用是一個很有用的特性。它能夠把子表達式的匹配部分保存在臨時緩沖區中,供以后重用。緩沖區從左至右進行編號,並利用 \digit 符號進行訪問。子表達式用一組圓括號來顯示。利用后向引用可以實現較復雜的替換功能。下面的regexp_replace('Steven Chen', '(.*) (.*)', '\2, \1') 此函數中,首先在正則表達式函數中,('Steven Chen', '(.*) (.*)', 其中兩個圓括號中會匹配出Chen, Steven;再使用"\數字“的符號進行引用。123456789
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