首页 > 数据库 > Oracle > Oracle SQL函数(五) Hacker
4
本节介绍正则表达式及相关的Oracle数据库函数。使用这些函数可以在字符串中搜索字符模式。例如,假设有下列年份:
1965
1968
1971
1970
如果希望获得1965年和1968年之间的年份(包括1965年和1968年),就可以使用下面的正则表达式实现这种功能:
^196[5-8]$
正则表达式中包含许多元字符(metacharacter)。在上面这个例子中,^、[5-8]以及$都是元字符。^可以匹配一个字符串的开头;[5-8]可以匹配介于5~8之间的数字;$可以匹配一个字符串的结尾。因此,^196可以匹配以196开头的字符串;[5-8]$可以匹配以5、6、7或8结尾的字符串。而^196[5-8]$就可以匹配1965、1966、1967和1968,这就是想要的结果。
在下面这个例子中,假设有如下字符串,其中引用了莎士比亚的《罗密欧与朱丽叶》中的一句台词:
But,
如果想查找子字符串light,可以对引用的字符串应用下面的正则表达式:
l[[:alpha:]]{4}
在这个例子中,[[:alpha:]]和{4}都是元字符。[[:alpha:]]可以匹配A-Z或a-z之间的字符;{4}表示前面的匹配模式可以重复4次。当l、[[:alpha:]]和{4}一起使用时,可以匹配以
表1-7列出了在正则表达式中可以使用的部分元字符,同时还给出了这些元字符的意思以及使用这些元字符的简单例子。
表1-7
|
元 |
意 |
例 |
|
|
|
说明要匹配的字符是一个特殊字符、常量或者反向引用。(反向引用重复上一次匹配。) |
\
(
) |
|
|
^ |
匹配字符串的开头位置 |
如果A是字符串中的第一个字符,^A |
|
|
$ |
匹配字符串的末尾位置 |
如果B是字符串中的最后一个字符,$B匹配B |
|
|
* |
匹配前面的字符0次或多次。 |
ba*rk |
|
|
+ |
匹配前面的字符1次或多次。 |
ba+rk |
|
|
? |
匹配前面的字符0次或1次 |
ba?rk |
|
|
{n} |
匹配一个字符恰好n次,其中n是一个整数 |
hob{2}it |
|
|
{n,m} |
匹配一个字符至少n次,最多m次,其中n和m都是整数 |
hob{2,3}it |
|
|
. |
匹配除null之外的任意单个字符 |
hob.it |
|
|
(pattern) |
匹配指定模式的一个子表达式。可以使用子表达式构成复杂的正则表达式。在这种子表达式中,可以访问单次的匹配,称为捕获(capture) |
anatom(y|ies) |
|
|
x|y |
匹配x或y,其中x和y是一个或多个字符 |
war|peace |
|
|
[abc] |
匹配中括号内的任意一个字符 |
[ab]bc |
|
|
[a-z] |
匹配指定范围内的任意一个字符 |
[a-c]bc |
|
|
[: |
指定一个字符类,可以匹配该类中的任何字符 |
[:alphanum:]
[:alpha:]
[:blank:]
[:digit:]
[:graph:]
[:lower:]
[:print:]
[:punct:]
[:space:]
[:upper:]
[:xdigit:] |
|
|
[..] |
匹配一个组合元素,例如多字符元素 |
无 |
|
|
[==] |
指定等价类 |
无 |
|
|
|
这是对前一次捕获的一个反向引用,其中n是一个正整数 |
(.)1 |
|
|
|
|
|
|
|
|
|
|
|
Oracle
表1-8
|
元 |
含 |
|
d |
数字字符 |
|
D |
非数字字符 |
|
w |
字母字符 |
|
W |
非字母字符 |
|
s |
空白字符 |
|
S |
非空白字符 |
|
A |
只匹配字符串的开头位置 |
|
|
只匹配字符串的末尾位置或者字符串末尾的换行符之前的位置 |
|
*? |
匹配前面的模式元素0次或多次 |
|
+? |
匹配前面的模式元素1次或多次 |
|
?? |
匹配前面的模式元素0次或1次 |
|
{n} |
匹配前面的模式元素恰好n次 |
|
{n,} |
匹配前面的模式元素至少n次 |
|
{n,m} |
匹配前面的模式元素至少n次,但不超过m次 |
表1-9列出了正则表达式函数。正则表达式函数是在Oracle
表1-9
|
函 |
说 |
|
REGEXP_LIKE(
|
从x中搜索pattern参数中定义的正则表达式。可以使用match_option修改默认匹配选项,该参数可以被设置为:
•
•
•
• |
|
REGEXP_INSTR(
[, |
在x中查找pattern,并返回pattern所在的位置。可以指定以下的可选参数:
•
•
•
•
• |
|
REGEXP_REPLACE(x,
|
在x中查找pattern,并将其替换为replace_string。其他选项的意思与 |
|
REGEXP_SUBSTR(
[, |
返回x中可以匹配pattern的一个子字符串,其开始位置由start指定。其他选项的意思与 |
|
REGEXP_COUNT(
|
这是Oracle
•
• |
接下来将会介绍更多有关正则表达式函数的知识。
1.
REGEXP_LIKE(x,
●
●
●
●
下面这个查询使用REGEXP_LIKE函数检索生日在1965年到1968年之间的顾客:
SELECT
FROM
WHERE
CUSTOMER_ID
-----------
下面这个查询检索名字以J或j开头的顾客。注意传递给REGEXP_LIKE()的正则表达式是
SELECT
FROM
WHERE
CUSTOMER_ID
-----------
2.
REGEXP_INSTR(x,
下面这个查询使用REGEXP_INSTR函数返回匹配正则表达式
SELECT
'l[[:alpha:]]{4}')
FROM
RESULT
----------
17
注意返回值为17,这是light中l的位置。
下面这个查询返回第二次匹配正则表达式
SELECT
REGEXP_INSTR('But,
's[[:alpha:]]{3}',
FROM
RESULT
----------
45
下面这个查询使用REGEXP_INSTR函数返回第二次匹配字母
SELECT
REGEXP_INSTR('But,
'o',
FROM
RESULT
----------
32
3.
REGEXP_REPLACE(x,
下面这个查询使用REGEXP_REPLACE函数将匹配正则表达式
SELECT
REGEXP_REPLACE('But,
'l[[:alpha:]]{4}',
FROM
RESULT
---------------------------------------------------
But,
注意light已经被替换为sound。
4.
REGEXP_SUBSTR(x,
下面这个查询使用REGEXP_SUBSTR函数返回匹配正则表达式
SELECT
REGEXP_SUBSTR('But,
'l[[:alpha:]]{4}')
FROM
RESUL
-----
light
5.
REGEXP_COUNT()是Oracle
下面这个查询使用REGEXP_COUNT函数返回正则表达式s[[:alpha:]]{3}出现的次数:
SELECT
FROM
--------
注意返回结果是2,这表明正则表达式在提供的字符串中有两次匹配
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7208299/viewspace-1115562/ ,如需转载,请注明出处,否则将追究法律责任。