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 |
| ||||||||||||||||||||||||||
Posix Characters |
|
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_$;
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;
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
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;
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;
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_REPLACE,REGEXP_LIKE,REGEXP_COUNT
--
在小写与大写之间加个空隔
SELECT REGEXP_REPLACE( ' HongKong ' , ' ([[:lower:]])([[:upper:]]) ' , ' \1 \2 ' ) Result FROM dual;
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 * FROM Article_Detail WHERE REGEXP_LIKE(Content, ' ([az])\1 ' , ' i ' );
--
符合正则表达式字符串的个数
SELECT REGEXP_COUNT(Content, ' 2a ' , 1 , ' i ' ) Result FROM Article_Detail;
SELECT REGEXP_COUNT(Content, ' 2a ' , 1 , ' i ' ) Result FROM Article_Detail;