(written in 2011-10-10 12:11:09 )
运算符 | 说明 |
\ | 反斜线字符根据上线文有4种含义。表示自己本身,引用下一个字符,引入一个运算符或什么都不做 |
* | 匹配零次或多次出现 |
+ | 匹配一次或多次出现 |
? | 匹配零次或多次出现 |
| | 指定其他匹配项的运算符 |
^ | 匹配行的开始字符 |
$ | 匹配行的结束字符 |
. | 匹配除NULL意外的受支持的字符集中的任何字符 |
[] | 方括号表达式指定一匹配列表,该列表匹配列表中显示的任何表达式。非匹配列表达式以^开始,指定一个列表,除了列表中的显示的表达式,该列表可以匹配任何字符 |
() | 分组表达式,看作单个子 |
{m} | 匹配m次 |
{m,} | 至少匹配m次 |
{m,n} | 至少匹配m次,但不超过n次 |
\n | 反向引用backreference表达式(n是1-9之间的数字)匹配圆括号和前面的\n之间的第n个子表达式 |
[..] | 指定一个对照(collation)元素,可以是多字符元素(如,西班牙语中的[.ch.]) |
[::] | 指定字符类型(如:[:alpha:])。可以匹配字符类中任何字符 |
[==] | 指定等价类。例如:[=a=]匹配所有包含基本字母“a”的字符 |
字符类语法 | 含义 |
[:alnum:] | 所有字母和数字字符 |
[:alpha:] | 所有的字母字符 |
[:blank:] | 所有的空格字符 |
[:cntrl:] | 所有的控制字符(不会打印出来) |
[:digit:] | 所有的数字 |
[:graph:] | 所有的[:punct:],[:upper:],[:lower:]和[:digit:]字符 |
[:lower:] | 所有的小写字母 |
[:print:] | 所有可打印的字符 |
[:punct:] | 所有的标点符号 |
[:space:] | 所有的空格字符(不会打印出来) |
[:upper:] | 所有的大写字母 |
[:xdigit:] | 所有有效的十六进制字符 |
例:从串中指定的地方开始搜索,一直到遇到下一个逗号
SELECTREGEXP_SUBSTR('MY LEDGER:Debits,Credits,and Invoices 1940',
'[:punct:][^,]+,'} "REGEXP_SUBBSTR"
FROM DUAL;
结果如下
REGEXP_SU
----------------
: Debits,
REGEXP_SUBSTR函数
使用正则表达式来指定返回事的起点和终点。
REGEXP_SUBSTR(source_string,patten
[, position
[,occurrence
[,match_parameter]
]
]
)
REGEXP_SUBSTR返回与source_string字符集中的VARCHAR2或CLOB数据相同的字符串。position默认值值为1,从第一个字符开始搜索;occurrence默认值为1的整型,指出Oracle应该在source_string中搜索patten指定的那一次出现。match_parameter是一个文本量,允许对函数的默认匹配行为进行更改,它可能的取值有:
- 'i' 用于不区分大小的匹配
- 'c' 用于区分大小写的匹配
- 'n'允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换成行符
- 'm'将源串视为多行,即Oracle将“^”和“$”分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始成结束。若缺省该参数则oracle将源串当作一行。
如果match_parameter指定了多个先后矛盾的值,那么Oracle使用最后一个值。
例:如果指定了“ic”,oracle将使用区分大小写的匹配。
例子:搜索不区分大小写匹配
SELECTREGEXP_SUBSTR
('MY LEDGER: Debits,Credits,and Invoices 1940',
'my',1,1,'i') "REGEXP_SUBSTR"
FROM DUAL;
RE
--
MY
REGEXP_INSTR函数
REGEXP_INSTR(source_string,pattern
[,position
[,occurrence
[,return_option
[,match_parameter]
]
]
]
)
如果return_option为0则oracle返回第一个字符出现的位置。这是默认值,与INSTR的作用相同。
如果return_option为1,则oracle返回跟在所搜索字符出现以后下一个字符的位置,例如:查询返回了在串中发现的第一个数字的位置:
SELECT REGEXP_INSTR
('MY LEDGER:Debits,Creadits,and Invoices 1940',
'[[:digit:]]' "REGEXP_INSTR"
FROM DUAL;
运行结果:
REGEXP_INSTR
---------------------
42
REGEXP_LIKE函数
REGEXP_LIKE(source_string,pattern
[ match_parameter]
}
例:查询电话号码以415开头的人
SELECT lastname
FORM address
WHERE REGEXP_LIKE(Phone,'415+');
运行结果:
LASTNAME
-------------------------------------------
ADAMS
ZACK
YARROW
WERSCHKY
BRANT
EDGAR
REPLACE和REGEXP_REPLACE函数
REPLACE(char,search_string[,replace_string])
如果没有指定replace_string变量的值,当发现search_string时就会删除。可以输入任何数据类型:char,varchar2,nchar,nvarchar2,clob,nclob.
REGEXP_REPLACE(source_string,pattern
[,replace_string
[,position
[,occurrence
[,match_parameter]
]
]
]
)
occurrence是一个非负整数,它指定操作的次数:如果是0,则所有的匹配项目都被替代;如果指定一个正数,则Oracle替代第N次匹配
例:address表中的phone列,首先寻找格式为###-###-####的号码。该格式分为3个部分,#为数字部分,用-隔开。
SELECT REGEXP_SUBSTR(Phone,
'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})
) "REGEXP_SUBBSTR"
FROM address
运行结果:
REGEXP_SUBST
---------------------
213-456-1567
546-458-1564
例:把上面的例子改成,把前面3个数字放在括号内,同时省略第一个“-”。为此,第1个数据的字符集为\1,第2个数据集为\2,第3个数据集为\3
SELECT REGEXP_REPLACE(Phone,
'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'
,'(\1) \2-\3'
) "REGEXP_REPLACE"
FROM address
运行结果:
REGEXP_SUBST
---------------------
(213) 456-1567
(546) 458-1564
例:将电话中的第二个5替换成"."
SELECT REGEXP_REPLACE(Phone,
'5','.',
1,2
) "REGEXP_REPLACE"
FROM address;
运行结果:
REGEXP_SUBST
---------------------
213-456-1.67
546-4.8-1564
REGEXP_COUNT函数
REGEXP_COUNT(source_char,pattern[,position[,match_param]])
REGEXP_COUNT返回pattern 在source_char 串中出现的次数。如果未找到匹配,则函数返回0。position 变量告诉Oracle 在源串的什么位置开始搜索。在开始位置之后每出现一次模式,都会使计数结果增加1。
match_param 变量支持下面几个值:
- ‘i’ 用于不区分大小写的匹配
- ‘c’ 用于区分大小写的匹配
- ‘n’ 允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换行符
- ‘m’ 将源串视为多行。即Oracle将^和$分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始或结束。如果省略该参数,则Oracle将源串看作一行。
- ‘x’ 忽略空格字符。默认情况下,空格字符与自身相匹配。
用REGEXP_COUNT 取代LENGTH 还有一个好处,即可以进行不区分大小写的搜索,因此,前面的查询也可以写成下面这样:
select REGEXP_COUNT('GEORGE','ge',1,'i')
from DUAL;