IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle 正則表達式

Oracle 正則表達式

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

  Oracle 10g數(shù)據(jù)庫內(nèi)建了符合IEEE POSIX (Portable Operating System for Unix)標(biāo)準(zhǔn)的正則表達式。熟練使用正則表達式,可以寫出簡潔,強大的SQL語句。

  正則表達式有幾個優(yōu)點優(yōu)于常見的LIKE操作符和INSTR、SUBSTR及REPLACE 函數(shù)的。這些傳統(tǒng)的SQL 函數(shù)不便于進行模式匹配。只有LIKE 操作符通過使用%和_字符匹配,但LIKE不支持表達式的重復(fù)、復(fù)雜的更替、字符范圍、字符列表和POSIX 字符類等等。

  元字符(Meta Character):

  Sql代碼

  ^????? 使表達式定位至一行的開頭

  $????? 使表達式定位至一行的末尾

  *????? 匹配 0 次或更多次

  ?????? 匹配 0 次或 1 次

  +????? 匹配 1 次或更多次

  {m}??? 正好匹配 m 次

  {m,}?? 至少匹配 m 次

  {m, n} 至少匹配 m 次但不超過 n 次

  [:alpha:]??? 字母字符

  [:lower:]??? 小寫字母字符

  [:upper:]??? 大寫字母字符

  [:digit:]??? 數(shù)字

  [:alnum:]??? 字母數(shù)字字符

  [:space:]??? 空白字符(禁止打?。缁剀嚪?、換行符、豎直制表符和換頁符[:punct:]??? 標(biāo)點字符

  [:cntrl:]??? 控制字符(禁止打?。?/p>

  [:print:]??? 可打印字符 | 分隔替換選項,通常與分組操作符 () 一起使用

  ( )??? 將子表達式分組為一個替換單元、量詞單元或后向引用單元

  [char] 字符列表

  Oracle 10g提供了四個regexp function: REGEXP_LIKE , REGEXP_REPLACE , REGEXP_INSTR , REGEXP_SUBSTR 。

  Sql代碼

  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]]]])? 其中各參數(shù)的含義為:

  Sql代碼

  srcstr:? 被查找的字符數(shù)據(jù)。

  pattern: 正則表達式。

  occurrence:??? 出現(xiàn)的次數(shù)。默認為1。

  position:????? 開始位置

  return_option: 默認值為0,返回該模式的起始位置;值為1則返回符合匹配條件的下一個字符的起始位置。

#p#副標(biāo)題#e#

  replacestr:??? 用來替換匹配模式的字符串。

  match_option:? 匹配方式選項。缺省為c。

  c:case sensitive

  I:case insensitive

  n:(.)匹配任何字符(包括newline)

  m:字符串存在換行的時候被作為多行處理

  下面通過一些具體的例子來說明如何使用這四個函數(shù)。首先創(chuàng)建一個測試數(shù)據(jù)表,

  Sql代碼

  SQL> create table person (

  2? first_name varchar(20),

  3? last_name varchar(20),

  4? email varchar(100),

  5? zip varchar(6));

  Table created.

  SQL> insert into person values ('Steven', 'Chen', '[email protected]', '123456');

  1 row created.

  SQL> insert into person values ('James', 'Li', '[email protected]' || chr(10) || '[email protected]', '1b3d5f');

  1 row created.

  SQL> commit;

  Commit complete.

  SQL> select * from person;

  FIRST_NAME LAST_NAME? EMAIL??? ZIP

  ---------- ---------- -------------------- ------

  Steven???? Chen [email protected]? 123456

  James????? Li?? [email protected]????? 1b3d5f

  [email protected]

  1。REGEXP_LIKE

  Sql代碼

  SQL> select zip as invalid_zip from person where regexp_like(zip, '[^[:digit:]]');

  INVALID_ZIP

  --------------------

  1b3d5f

  SQL> select first_name from person where regexp_like(first_name, '^S.*n$');

  FIRST_NAME

  ----------

  Steven

  SQL> select first_name from person where regexp_like(first_name, '^s.*n$');

  no rows selected

  SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'c');

  no rows selected

  SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'i');

  FIRST_NAME

  ----------

  Steven

  SQL> select email from person where regexp_like(email, '^james.*com$');

  no rows selected

  SQL> select email from person where regexp_like(email, '^james.*com$', 'n');

  EMAIL

  --------------------

  [email protected]

  [email protected]

  SQL> select email from person where regexp_like(email, '^li.*com$');

  no rows selected

  SQL> select email from person where regexp_like(email, '^li.*com$', 'm');

  EMAIL

  --------------------

  [email protected]

  [email protected]

  2。REGEXP_INSTR

  Sql代碼

  查找zip中第一個非數(shù)字字符的位置

  SQL> select regexp_instr(zip, '[^[:digit:]]') as position from person;

  POSITION

  ----------

  0

  2

#p#副標(biāo)題#e#

  從第三個字符開始,查找zip中第二個非數(shù)字字符的位置

  SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2) as position from person;

  POSITION

  ----------

  0

  6

  從第三個字符開始,查找zip中第二個非數(shù)字字符的下一個字符位置

  SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2, 1) as position from person;

  POSITION

  ----------

  0

  7

  3。REGEXP_SUBSTR

  Sql代碼

  SQL> select regexp_substr(zip, '[^[:digit:]]') as zip from person;

  ZIP

  ------------------

  b

  SQL> select regexp_substr(zip, '[^[:digit:]]', 3, 2) as zip from person;

  ZIP

  ------------

  f

  4。REGEXP_REPLACE

  Sql代碼

  把zip中所有非數(shù)字字符替換為0

  SQL> update person set zip=regexp_replace(zip, '[^[:digit:]]', '0')

  2? where regexp_like(zip, '[^[:digit:]]');

  1 row updated.

  SQL> select zip from person;

  ZIP

  ------

  123456

  103050

  后向引用(backreference):

  后向引用是 一個很有用的特性。它能夠把子表達式的匹配部分保存在臨時緩沖區(qū)中,供以后重用 。緩沖區(qū)從左至右進行編號,并利用 \digit 符號進行訪問。子表達式用一組圓括號來顯示。利用后向引用可以

關(guān)鍵詞標(biāo)簽:Oracle

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法