您的位置:首页 > 数据库 > Oracle

Oracle正则表达式简单例子

2011-07-02 19:50 204 查看
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:黄色背景表示匹配的字符串,绿色的字符表示返回此字符的位置。下面第一个例子参数(1, 1, 0)的意思是:第一个1表示从第1个字符开始,第二个1表示匹配成功的第1个字符串,0表示从匹配字符串的首字符算起。

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

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

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

SELECT REGEXP_INSTR('500 Oracle Pkwy, Redwood Shores, 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;
REGEXP_REPLACEREGEXP_LIKEREGEXP_COUNT

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

3.

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

--查找表Article_Detail字段Content中包含a或z的记录
SELECT * FROM Article_Detail WHERE REGEXP_LIKE(Content, '([az])\1', 'i');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: