oracle数据库中使用正则表达式的方法

2024-11-21 1

本文介绍 Oracle 数据库的正则表达式支持。本文涵盖以下主题:

  • 什么是正则表达式?

  • Oracle 数据库正则表达式支持

  • 用于正则表达式的 Oracle 数据库 SQL 函数

  • 正则表达式中支持的元字符

  • 构建正则表达式

1. 什么是正则表达式?

正则表达式使用标准化语法约定指定要在字符串数据中搜索的模式。正则表达式可以指定复杂的字符序列模式。例如,以下正则表达式:

1
a(b|c)d

搜索模式:“a”,后跟“b”或“c”,最后跟“d”。此正则表达式同时匹配“abd”和“acd”。

正则表达式使用两种类型的字符指定:

  • 元字符——指定执行搜索的算法的运算符。

  • 文字——要搜索的实际字符。

2. Oracle 数据库正则表达式支持

Oracle 数据库实现了符合 POSIX 扩展正则表达式 (ERE) 规范的正则表达式支持。

正则表达式支持是通过一组 Oracle 数据库 SQL 函数实现的,这些函数允许您搜索和操作字符串数据。您可以在任何使用 Oracle 数据库 SQL 的环境中使用这些函数。有关详细信息,请参阅本章后面的“用于正则表达式的 Oracle 数据库 SQL 函数”。

Oracle 数据库支持正则表达式中使用的一组常见元字符。支持的元字符和相关功能的行为在“正则表达式中支持的元字符”中进行了描述。

业界支持正则表达式的工具之间对元字符的解释有所不同。如果您要将正则表达式从其他环境移植到 Oracle 数据库,请确保正则表达式语法受支持并且行为符合您的预期。

3. 用于正则表达式的 Oracle 数据库 SQL 函数

数据库提供了一组 SQL 函数,允许您使用正则表达式搜索和操作字符串。您可以在任何保存字符数据的数据类型(例如 CHAR、NCHAR、CLOB、NCLOB、NVARCHAR2 和 VARCHAR2)上使用这些函数。

正则表达式必须用单引号括起来。这样做可以确保 SQL 函数解释整个表达式,并可以提高代码的可读性。

下表给出了每个正则表达式函数的简要说明。

SQL FunctionDescription
REGEXP_LIKE该函数在字符列中搜索模式。在查询的 WHERE 子句中使用此函数可返回与您指定的正则表达式匹配的行。
REGEXP_REPLACE此函数在字符列中搜索模式,并用您指定的模式替换每次出现的该模式。
REGEXP_INSTR该函数在字符串中搜索给定的正则表达式模式。您指定要查找的出现位置以及搜索的起始位置。此函数返回一个整数,指示在字符串中找到匹配项的位置。
REGEXP_SUBSTR此函数返回与您指定的正则表达式模式匹配的实际子字符串。

4. 正则表达式中支持的元字符

下表列出了支持在传递给 SQL 正则表达式函数的正则表达式中使用的元字符。有关这些元字符的匹配行为的详细信息在“构造正则表达式”中给出。

Metacharacter SyntaxOperator NameDescription
.任意字符——点匹配任意字符
+一个或多个——加上量词匹配前面的子表达式的一次或多次出现
?零或一——问号量词匹配前面的子表达式零次或一次出现
*零或更多——星量词匹配前面的子表达式零次或多次出现
{m}间隔–精确计数精确匹配前面子表达式的 m 次出现
{m,}间隔——至少计数匹配至少 m 次出现的前面的子表达式
{m,n}间隔–计数之间匹配至少 m ,但不超过 n 出现的前面的子表达式
[ … ]匹配字符列表匹配列表中的任意字符 …
[^ … ]不匹配的字符列表匹配列表中不存在的任何字符 …
|Or‘a|b’ 匹配字符“a”或“b”。
( … )子表达式或分组将表达式 … 视为一个单元。子表达式可以是文字字符串或包含运算符的复杂表达式。
\n子表达式或分组将表达式 … 视为一个单元。子表达式可以是文字字符串或包含运算符的复杂表达式。
\转义字符将表达式中的后续元字符视为文字。
^线锚点的起点仅当后续表达式出现在行首时才匹配它。
$行末锚点仅当前面的表达式出现在行尾时才匹配它。
[:class:]POSIX 字符类匹配属于指定字符 class 的任何字符。可以在任何列表表达式中使用。
[.element.]POSIX 整理序列指定要在正则表达式中使用的整理顺序。您使用的 element 必须是当前区域设置中定义的整理序列。
[=character=]POSIX 字符等效类匹配与您指定的 character 具有相同基本字符的字符。

5. 构建正则表达式

使用正则表达式进行基本字符串匹配

可以使用正则表达式执行的最简单的匹配是基本字符串匹配。对于这种类型的匹配,正则表达式是不带元字符的文字字符串。例如,要查找序列“abc”,请指定正则表达式:

1
abc

子表达式的正则表达式运算

如前所述,正则表达式是使用元字符和文字构造的。对单个文字进行操作的元字符,例如“+”和“?”还可以对文字序列或整个表达式进行操作。为此,您可以使用分组运算符将序列或子表达式括起来。有关分组的更多信息,请参阅“子表达式”。

正则表达式运算符和元字符用法

匹配任何字符–点,点运算符 ‘.’ 匹配当前字符集中的任何单个字符。例如,要查找序列(“a”,后跟任何字符,后跟“c”),请使用以下表达式:

1
a.c

该表达式匹配以下所有序列:

1
2
3
4
abc
adc
a1c
a&c

表达式不匹配:

1
abb

一个或多个——加上,一个或多个运算符 ‘+’ 与前面的表达式的一个或多个匹配项相匹配。例如,要查找字符“a”的一次或多次出现,可以使用正则表达式:

1
a+

该表达式匹配以下所有内容:

1
2
3
a
aa
aaa

表达式不匹配:

1
bbb

零或一——问号运算符,问号与前面的字符或子表达式的零次或一次(并且仅一次)匹配。您可以将此运算符视为指定源文本中可选的表达式。例如,要查找“a”,可选地后跟“b”,然后后跟“c”,您可以使用以下正则表达式:

1
ab?c

该表达式匹配:

1
2
abc
ac

表达式不匹配:

1
2
adc
abbc

零个或更多——星星,零个或多个运算符 ‘*’ 匹配零个或多次出现的前面的字符或子表达式。例如,要查找“a”,后跟零个或多次出现的“b”,然后是“c”,请使用正则表达式:

1
ab*c

该表达式匹配以下所有序列:

1
2
3
4
ac
abc
abbc
abbbbc

表达式不匹配:

1
adc

间隔–精确计数,精确计数间隔运算符用大括号内的单个数字指定。您可以使用此运算符来搜索前面的字符或子表达式的确切出现次数。例如,要查找“a”恰好出现 5 次的位置,您可以指定正则表达式:

1
a{5}

该表达式匹配:

1
aaaaa

表达式不匹配:

1
aaaa

间隔——至少计数,您可以使用至少计数间隔运算符来搜索前面的字符或子表达式出现指定次数或多次的情况。例如,要查找“a”至少出现 3 次的位置,可以使用正则表达式:

1
a{3,}

该表达式匹配以下所有内容:

1
2
aaa
aaaaa

表达式不匹配:

1
aa

间隔–计数之间,您可以使用计数间隔运算符来搜索指定范围内的出现次数。例如,要查找“a”出现至少 3 次但不超过 5 次的位置,可以使用以下正则表达式:

1
a{3,5}

该表达式匹配以下所有序列:

1
2
3
aaa
aaaa
aaaaa

表达式不匹配:

1
aa

匹配字符列表,您可以使用匹配字符列表来搜索列表中出现的任何字符。例如,要查找“a”、“b”或“c”,请使用以下正则表达式:

1
[abc]

此表达式匹配以下每个字符串中的第一个字符:

1
2
3
at
bet
cot

表达式不匹配:

1
def

字符列表中允许使用以下正则表达式运算符,字符列表中包含的任何其他元字符都会失去其特殊含义(被视为文字):

  • 范围运算符 ‘-’

  • POSIX 字符类 [: :]

  • POSIX 整理序列 [. .]

  • POSIX 字符等效类 [= =]

不匹配的字符列表,使用非匹配字符列表指定您不想匹配的字符。不在非匹配字符列表中的字符将作为匹配项返回。例如,要从搜索结果中排除字符“a”、“b”和“c”,请使用以下正则表达式:

1
[^abc]

此表达式匹配以下字符串中的字符“d”和“g”:

1
2
abcdef
ghi

表达式不匹配:

1
abc

与匹配字符列表一样,非匹配字符列表中允许使用以下正则表达式运算符(字符列表中包含的任何其他元字符都将被忽略):

  • 范围运算符 ‘-’

  • POSIX 字符类 [: :]

  • POSIX 整理序列 [. .]

  • POSIX 字符等效类 [= =]

例如,以下正则表达式从搜索结果中排除“a”和“i”之间的任何字符:

1
[^a-i]

此表达式与以下字符串中的字符“j”和“l”匹配:

1
2
hijk
lmn

表达式与字符不匹配:

1
abcdefghi

使用 Or 运算符 ‘|’ 指定替代表达式。例如,要匹配“a”或“b”,请使用以下正则表达式:

1
a|b

子表达式,您可以使用子表达式运算符将要查找的字符分组为字符串或创建复杂的表达式。例如,要查找后跟“def”的可选字符串“abc”,请使用以下正则表达式:

1
(abc)?def

此表达式与以下字符串中的字符串“abcdef”和“def”匹配:

1
2
abcdefghi
defghi

表达式与字符串不匹配:

1
ghi

反向引用,反向引用可让您搜索重复的表达式。您可以使用 ‘\n’ 指定反向引用,其中 n 是 1 到 9 之间的整数,表示 n th,

1
反向引用可让您搜索重复的表达式。您可以使用 '\ n ' 指定反向引用,其中 n 是 1 到 9 之间的整数,表示 n th

例如,要查找重复出现的字符串“abc”或“def”,请使用以下正则表达式:

1
(abc|def)\1

该表达式匹配以下字符串:

1
2
abcabc
defdef

该表达式与以下字符串不匹配:

1
2
abcdef
abc

反向引用从每个前面的子表达式的左括号开始从左到右对子表达式进行计数。

反向引用允许您搜索重复的字符串,而无需提前知道实际的字符串。例如,正则表达式:

1
^(.*)\1$

匹配由同一字符串的两个相邻出现组成的行。

转义字符,使用转义字符 ‘’ 搜索通常被视为元字符的字符。例如,要搜索“+”字符,请使用以下正则表达式:

1
\+

此表达式与以下字符串中的加号“+”匹配:

1
abc+def

表达式与字符串中的任何字符都不匹配:

1
abcdef

线锚点的起点,使用行开头锚点 ^ 搜索仅出现在行开头的表达式。例如,要查找行开头出现的字符串 def ,请使用以下表达式:

1
^def

此表达式与字符串中的 def 匹配:

1
defghi

该表达式与以下字符串中的 def 不匹配:

1
abcdef

行末锚点,行尾锚元字符 ‘$’ 允许您搜索仅出现在行尾的表达式。例如,要查找出现在行尾的 def ,请使用以下表达式:

1
def$

此表达式与字符串中的 def 匹配:

1
abcdef

该表达式与以下字符串中的 def 不匹配:

1
defghi

POSIX 字符类,POSIX 字符类运算符允许您在字符列表中搜索属于特定 POSIX 字符类成员的表达式。您可以使用此运算符搜索具有特定格式的字符(例如大写字符),也可以搜索特殊字符(例如数字或标点符号字符)。支持全套 POSIX 字符类。

要使用此运算符,请使用语法 [: class :] 指定表达式,其中 class 是要搜索的 POSIX 字符类的名称为了。例如,要搜索一个或多个连续的大写字符,请使用以下正则表达式:

1
[[:upper:]]+

此表达式与字符串中的“DEF”匹配:

1
abcDEFghi

该表达式不返回以下字符串的匹配项:

1
abcdefghi

POSIX 整理序列,POSIX 整理序列元素运算符 [. .] 允许您在正则表达式中使用整理序列。您指定的元素必须是当前语言环境中定义的整理序列。

此运算符允许您在正则表达式中使用多字符整理序列,否则只允许使用一个字符。例如,您可以使用此运算符来确保整理序列“ch”(在西班牙语等语言环境中定义时)在取决于字符顺序的操作中被视为一个字符。

要使用整理序列运算符,请指定 [. element .] ,其中 element 是您要查找的整理序列。您可以使用当前区域设置中定义的任何整理序列,包括单字符元素和多字符元素。

例如,要查找整理序列“ch”,请使用以下正则表达式:

1
[[.ch.]]

此表达式与以下字符串中的序列“ch”匹配:

1
chabc

该表达式与以下字符串不匹配:

1
cdefg

您可以在需要排序规则的任何正则表达式中使用排序序列运算符。例如,要指定从“a”到“ch”的范围,可以使用以下表达式:

1
[a-[.ch.]]

POSIX 字符等效类,使用 POSIX 字符等效类运算符搜索当前区域设置中等效的字符。例如,查找西班牙语字符“ñ”以及“n”。

要使用此运算符,请指定 [= character =] ,以查找与指定 character .

例如,以下正则表达式可用于在西班牙语语言环境中搜索相当于“n”的字符:

1
[[=n=]]

此表达式与以下字符串中的“N”和“ñ”匹配:

1
El Niño

完结!

refer: https://docs.oracle.com/cd/B13789_01/appdev.101/b10795/adfns_re.htm#1007566