tsql 正则_sql 正则表达式匹配
展開全部
當我們要進行一些簡單e69da5e887aa3231313335323631343130323136353331333339653738的糊涂查詢時用百分號(%),通配符(_)就可以了.其中%表達任意長度的字符串,_表示任意的某一個字符.
比如select?*?from?emp?where?ename?like?'s%'?or?ename?like?'s_';
但如果在一些復雜的查詢中關用這兩個符號sql語句就會非常復雜,而且也不一定能實現.從Oracle 10g開始引入了在其他程序語言中普通使用的正則表達式.
主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數.正則表達式中的元字符:
元字符 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?意思 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例子
\ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明要匹配的字符是一個特殊字符、常量或者后者引用。(后引用重復上一次的匹配)
\n ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配換行符
\\ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配 \
匹配(?匹配 )
^ ? ?匹配字符串的開頭位置 ? ?^a匹配arwen.但不匹配barwen.
$ ? ?匹配字符串的末尾位置 ? ?en$匹配arwen.但不匹配arwenb.
* ? ?匹配前面的字符0次或多次 ? ?a*rwen可以匹配rwen或aaarwen.
+ ? ?匹配前面的字符1次或多次 ? ?a+rwen可以匹配arwen或aarwen.但不能匹配rwen.
? ? ?匹配前面的字符0次或1次 ? ?a?rwen可以匹配arwen或rwen.但不能匹配aarwen.
{n} ? ?匹配前面的字符恰好是n次,其中n是整數 ? ?ar{2}wen可以匹配arrwen.但不能匹配arwen或arrrwen.
{n,m} ?匹配前面的字符至少是n次,最多是m次.如果寫成{n,} 表示最少匹配n次.沒有上限.
ar{1,2}wen可以匹配arwen,arrwen.但不匹配awen或arrrwen.
. ? ?點號,匹配除null,換行以外的任意單個字符 ? ?arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.
(pattern) ? ?括號中pattern是一個子正則表達式,匹配指定pattern模式的一個子表達式。 ? ?其實括號就像一般語言表達式中的括號.有時多加些括號可增強可讀性.另外的用處見下面關于\n的描述.
x|y ? ?匹配“或” ? ?x|y可以匹配x或者y
[abc] ? ?可以匹配abc中的任何單個字符 ? ?hello[abc]可以匹配helloa,hellob,helloc
[a-z] ? ?可以匹配指定范圍內的任何單個字符 ? ?hell[a-z]可以匹配hello或者hellz
[::] ? ?指定一個字符類,可以匹配該類中的任何字符 ? ?[:alphanum:]可以匹配字符0-9、A-Z、a-z
[:alpha:]可以匹配字符A-Z、a-z
[:blank:]可以匹配空格或tab鍵
[:digit:]可以匹配數字0-9
[:graph:]可以匹配非空字符
[:lower:]可以匹配小寫字母a-z
[:print:]與[:graph:]類似,不同之處在于[:print:]包括空格字符
[:punct:]可以匹配標點符號.,""等等
[:space:]可以匹配所有的空字符
[:upper:]可以匹配大寫字母A-Z
[:xdigit:]可以匹配十六進制數字0-9、A-F、a-f
\n ? ?這是對前一次匹配命中的一個后引用,其中n是一個正整數 ? ?arw(en)\1可以匹配arwenen.注意\1前面必須是個加括號的子表達式.regexp_like:
regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還可以提供一個可選的參數match_option字符串說明默認的匹配選項。match_option的取值如下:
‘c’?? 說明在進行匹配時區分大小寫(缺省值);
'i'?? 說明在進行匹配時不區分大小寫;
'n'???(.)點號能表示所有單個字符,包括換行(俺還不知道什么地方有用到換行.只知道sql里面可以用chr(10)表示換行.
'm'?? 字符串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字符串最后的位置.
示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');可以查找ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但Arwen不能被匹配.因為默認是區分大小寫.如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則可以查找ename為Arwen的行記錄.
2. ? ? regexp_instr:
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用于在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字符串函數 INSTR(),參數相關:
'start'?? 開始查找的位置;
'occurrence'?? 說明應該返回第幾次出現pattern的位置;
'return_option'?? 說明應該返回什么整數。若該參數為0,則說明要返回的整數是x中的一個字符的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之后?? 的字符的位置;
'match_option'?? 修改默認的匹配設置.與regexp_like里面的相同.
示例:
DECLARE
V_RESULT?INTEGER?;
BEGIN
SELECT? REGEXP_INSTR('hello world','o',1,1,0)?INTO? V_RESULT
FROM? DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為5.即字母o第一個次出現的位置
如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數.比如1,3.則結果為6.表示第一次出現字母o的后面一個字符的位置.
如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.
3. ? regexp_replace:
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用于在x中查找pattern,并將其替換為replae_string。可以參考字符串函數 REPLACE(),參數同REGEXP_INSTR函數
示例:
DECLARE
V_RESULT varchar2(90);
BEGIN
SELECT? REGEXP_REPLACE('hello world','o','x',1,1)?INTO? V_RESULTFROM? DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為hellx world.
如果REGEXP_REPLACE('hello world','o','x'),則結果為hellx wxrld.
如果 REGEXP_REPLACE('hello w
orld','o','x',1,2)則結果為hello wxrld.
4.regexp_substr:
REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用于在x中查找pattern并返回。可以參考字符串函數 SUBSTR(),參數同REGEXP_INSTR函數.
例如:
DECLARE
V_RESULT VARCHAR2(255);
BEGIN
SELECT??REGEXP_SUBSTR('hello world','l{2}')?INTO? V_RESULT
FROM? DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END?;
結果為ll
查詢到匹配的字符串才返回匹配的字符.沒查到就返回空.
總結
以上是生活随笔為你收集整理的tsql 正则_sql 正则表达式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python代理IP的使用
- 下一篇: 理解JS散度(Jensen–Shanno