Oracle正则表达式简单例子

1. 非贪婪模式

?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

2.

(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

3.

\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

4. Oracle11g正则表达式

Match Options
Character Class Description
c Case sensitive matching
iCase insensitive matching
mTreat source string as multi-line activating Anchor chars
nAllow the period (.) to match any newline character

Posix Characters
Character ClassDescription
[:alnum:]Alphanumeric characters
[:alpha:]Alphabetic characters
[:blank:]Blank Space Characters
[:cntrl:]Control characters (nonprinting)
[:digit:]Numeric digits
[:graph:]Any [:punct:], [:upper:], [:lower:], and [:digit:] chars
[:lower:]Lowercase alphabetic characters
[:print:]Printable charactersa
[:punct:]Punctuation characters
[:space:]Space characters (nonprinting), such as carriage return, newline, vertical tab, and form feed
[:upper:]Uppercase alphabetic characters
[:xdigit:]Hexidecimal characters
Oracle 正则例子 11g:

     1. REGEXP_SUBSTR:在字段Content_Text中,从第Offset位置开始匹配(参数Offset ),不区分大小写(参数 i ),符合正则表达式的第1个匹配字符串(参数1)赋给URL:

select  to_char(REGEXP_SUBSTR(Content_Text, ' (((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\& ' || ' %_\./-~-]*)? ' , Offset,  1 , ' i ' )) 
       
into  URL  from  article_detail  where  article_detail_id = article_detail_id_$;

 

    其它例子:最后4个参数(1,1,'i',1)说明:第一个1表示从第一个字符开始匹配,第二个1表示第1个符合匹配的字符串,i表示不区分大小写,第三个1表示第1个子表达式。下面例子的结果返回:rac

SELECT  REGEXP_SUBSTR( ' 500 Oracle Parkway, Redwood Shores, CA ' ' [o]([[:alpha:]]{3}) ' , 1 , 1 , ' i ' , 1 ) RESULT FROM  dual;

    2. REGEXP_INSTR:在字段Content_Text中,从第Offset位置开始匹配(参数Offset ),不区分大小写(参数 i ),符合正则表达式的第1个匹配字符串(第一个参数1),匹配字符串匹配后的第1个字符(第二个参数1, 0表示匹配字符串的第一个字符的位置)的位置赋给Offset.  

select  REGEXP_INSTR(Content_Text,  ' \w*:*/*/*([_a-z\d\-]+(\.[_a-z\d\-]+)+)((/[ _a-z\d\-\\\.]+)+)* ' , Offset,  1 1 , ' i ' )
       
into  Offset  from  article_detail  where  article_detail_id = article_detail_id_1;

 

 其它例子1:黄色背景表示匹配的字符串,绿色的字符表示返回此字符的位置。下面第一个例子参数(110)的意思是:第一个1表示从第1个字符开始,第二个1表示匹配成功的第1个字符串,0表示从匹配字符串的首字符算起。

 

SELECT  REGEXP_INSTR( ' 500  O rac l e Pkwy, Redwood Shores, CA ' ' [o][[:alpha:]]{3} ' 1 1 0 ' i ' ) RESULT
FROM  dual; 

SELECT  REGEXP_INSTR( ' 500  Orac l e Pkwy, Redwood Shores, CA ' ' [o][[:alpha:]]{3} ' 1 1 1 ' i ' ) RESULT
FROM  dual;

SELECT  REGEXP_INSTR( ' 500 Oracle Pkwy, Redwood Sh o res , CA ' ' [o][[:alpha:]]{3} ' 1 2 0 ' i ' ) RESULT
FROM  dual;

SELECT  REGEXP_INSTR( ' 500 Oracle Pkwy, Redwood Sh ores ,  CA ' ' [o][[:alpha:]]{3} ' 1 2 1 ' i ' ) RESULT
FROM  dual;

 

 其它例子2:

-- 最后一个参数表示第一个子表达式,结果返回0(没匹配到)
SELECT  REGEXP_INSTR( ' abcde ' ' ab ' 1 1 0 ' i ' 1 ) Result  FROM  dual;
-- 最后一个参数表示第一个子表达式,结果返回2(b的位置)
SELECT  REGEXP_INSTR( ' abcde ' ' a(b) ' 1 1 0 ' i ' 1 ) Result  FROM  dual;
-- 最后一个参数表示第二个子表达式,结果返回3(c的位置)
SELECT  REGEXP_INSTR( ' abcde ' ' a(b)(c) ' 1 1 0 ' i ' 2 ) Result  FROM  dual;

 

 3. REGEXP_REPLACEREGEXP_LIKEREGEXP_COUNT

-- 在小写与大写之间加个空隔
SELECT  REGEXP_REPLACE( ' HongKong ' ' ([[:lower:]])([[:upper:]]) ' ' \1 \2 ' ) Result  FROM  dual;

-- 查找表Article_Detail字段Content中包含a或z的记录
SELECT   *   FROM  Article_Detail  WHERE  REGEXP_LIKE(Content,  ' ([az])\1 ' ' i ' );

 

 

-- 符合正则表达式字符串的个数
SELECT  REGEXP_COUNT(Content,  ' 2a ' 1 ' i ' ) Result  FROM  Article_Detail;

转载于:https://www.cnblogs.com/krisy/archive/2010/01/18/1650508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle正则表达式是一种强大的工具,用于在字符串中进行模式匹配和替换。它使用标准的正则表达式语法,并提供了一系列内置函数来处理文本数据。 在Oracle中,可以使用REGEXP_LIKE函数来判断一个字符串是否匹配给定的正则表达式。例如,下面的查询将返回所有以字母开头的字符串: SELECT column_name FROM table_name WHERE REGEXP_LIKE(column_name, '^[a-zA-Z]') 除了REGEXP_LIKE外,Oracle还提供了其他正则表达式函数,如REGEXP_SUBSTR、REGEXP_REPLACE和REGEXP_INSTR。这些函数可以用于提取匹配的子字符串、替换匹配的文本或获取匹配的位置。 例如,使用REGEXP_SUBSTR函数可以从一个字符串中提取出第一个连续的数字。下面的查询将返回字符串中的第一个连续数字: SELECT REGEXP_SUBSTR(column_name, '[0-9]+') FROM table_name 除了支持常见的正则表达式元字符和字符类之外,Oracle还提供了一些特殊的正则表达式标记,用于更精确的匹配。例如,可以使用'[:digit:]'来匹配任意数字字符,而不仅仅是'0-9'。 在使用Oracle正则表达式时,需要注意性能方面的问题。正则表达式可能会耗费大量的系统资源,尤其是当处理大量数据时。因此,应该尽量避免不必要的正则表达式操作,并且使用提供的正则表达式函数来最大限度地优化查询性能。 总之,Oracle正则表达式是一种非常强大且灵活的工具,可用于在字符串中进行模式匹配和替换。它提供了一系列内置函数,使得处理文本数据更加方便和高效。但在使用过程中,需要权衡性能和灵活性,并尽量避免耗费大量的系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值