Oracle REGEXP_SUBSTR() 函数使用指南

Oracle REGEXP_SUBSTR() 是一个内置函数,它从一个给定的源字符串中搜索并返回一个与给定的正则表达式匹配的字符串。

您可以认为该函数是增加了正则表达式的 SUBSTR()

Oracle REGEXP_SUBSTR() 语法

这里是 Oracle REGEXP_SUBSTR() 函数的语法:

REGEXP_SUBSTR(source_char, pattern)
REGEXP_SUBSTR(source_char, pattern, position)
REGEXP_SUBSTR(source_char, pattern, position, occurrence)
REGEXP_SUBSTR(source_char, pattern, position, occurrence, match_param)
REGEXP_SUBSTR(source_char, pattern, position, occurrence, match_param, subexpr)

参数

source_char

必需的。从中搜索的字符串。它可以是 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, 或 NCLOB 中的任何一种数据类型。

pattern

必需的。正则表达式。它可以是 CHAR, VARCHAR2, NCHAR, 或 NVARCHAR2 中的任何一种数据类型。它最多包含 512 字节。

position

可选的。它是一个整数,指示开始搜索的起始位置。默认为 1

occurrence

可选的。它是一个整数,指示要返回的是第几次出现。默认为 1

match_param

可选的。执行匹配采用的模式。它可以是 VARCHAR2CHAR。您可以通过此参数改变默认的搜索行为。您可以使用以下的一个或多个字符:

  • 'i' 指定不区分大小写的匹配,即使确定的条件排序规则区分大小写。
  • 'c' 指定区分大小写和区分重音的匹配,即使确定的条件排序规则不区分大小写或不区分重音。
  • 'n' 允许句点 (.)(匹配任意字符)匹配换行符。如果省略此参数,则句点与换行符不匹配。
  • 'm' 将源字符串视为多行。Oracle 将插入符号 (^) 和美元符号 ($) 分别解释为源字符串中任意行的开始和结束,而不仅仅是整个源字符串的开始或结束。如果省略此参数,则 Oracle 会将源字符串视为单行。
  • 'x' 忽略空白字符。默认情况下,空白字符匹配自身。
subexpr

可选的。它从 0 到 9。0 表示整个正则表达式, 1-9 表示正则表达式中的分组。默认值为 0

返回值

Oracle REGEXP_SUBSTR() 从一个给定的源字符串中搜索并返回一个与给定的正则表达式匹配的字符串。

如果源字符串中没有与给定的正则表达式匹配的内容, REGEXP_SUBSTR() 将返回 NULL

如果任意一个参数为 NULLREGEXP_SUBSTR() 将返回 NULL

Oracle REGEXP_SUBSTR()` 示例

这里有几个展示了 Oracle REGEXP_SUBSTR() 函数用法的示例。

基本用法

以下语句用来找出字符串 '12AB34cd45ef' 中的连续的小写字母序列。

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '[a-z]+') Result
FROM dual;

输出:

RESULT
_________
cd

在本示例中,正则表达式模式 [a-z]+ 表示长度最小为 1 的小写字母序列。

如果源字符串中没有与给定的正则表达式匹配的内容, REGEXP_SUBSTR() 将返回 NULL

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '[a-z]{3,}') Result
FROM dual;

输出:

RESULT
_________
NULL

在本示例中,正则表达式模式 [a-z]{3,} 表示长度至少该为 3 小写字母序列。

起始位置

Oracle REGEXP_SUBSTR() 允许您指定开始搜索的位置。

以下语句用来找出字符串 '12AB34cd45ef' 中的连续的小写字母序列,从第 9 个字符开始搜索。

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '[a-z]+', 9) Result
FROM dual;

输出:

RESULT
_________
ef

第几次出现

Oracle REGEXP_SUBSTR() 允许您指定搜索第几次出现。

以下语句用来找出字符串 '12AB34cd45ef' 中的第 2 次出现的连续的小写字母序列。

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '[a-z]+', 1, 2) Result
FROM dual;

输出:

RESULT
_________
ef

匹配参数

Oracle REGEXP_SUBSTR() 允许您指定匹配选项以改变搜索行为。 Oracle 默认执行区分大小写的搜索,如果您不区分大小写,请使用 i 参数。

以下语句用来找出字符串 '12AB34cd45ef' 中连续的字母序列,不区分大小写。

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '[a-z]+', 1, 1, 'i') Result
FROM dual;

输出:

RESULT
_________
AB

子表达式

下面的语句展示了 Oracle REGEXP_SUBSTR() 函数中的子表达式是如何工作的。

SELECT
    REGEXP_SUBSTR('12AB34cd45ef', '([a-z])([a-z])', 1, 1, 'i', 0) Result0,
    REGEXP_SUBSTR('12AB34cd45ef', '([a-z])([a-z])', 1, 1, 'i', 1) Result1,
    REGEXP_SUBSTR('12AB34cd45ef', '([a-z])([a-z])', 1, 1, 'i', 2) Result2
FROM dual;

输出:

RESULT0    RESULT1    RESULT2
__________ __________ __________
AB         A          B

NULL 参数

如果任意一个参数为 NULLREGEXP_SUBSTR() 将返回 NULL

SET NULL 'NULL';
SELECT
    REGEXP_SUBSTR(NULL, 'a') "Result1",
    REGEXP_SUBSTR('a', NULL) "Result2",
    REGEXP_SUBSTR('a', 'b', NULL) "Result3",
    REGEXP_SUBSTR('a', 'b', 1, NULL) "Result4",
    REGEXP_SUBSTR('a', 'b', 1, 1, NULL) "Result5",
    REGEXP_SUBSTR('a', 'b', 1, 1, 'i', NULL) "Result6"
FROM dual;

输出:

Result1    Result2    Result3    Result4    Result5    Result6
__________ __________ __________ __________ __________ __________
NULL       NULL       NULL       NULL       NULL       NULL

在本示例中,我们使用 SET NULL 'NULL'; 语句将 NULL 值显示为 'NULL' 字符串。

结论

Oracle REGEXP_SUBSTR() 是一个内置函数,它从一个给定的源字符串中搜索并返回一个与给定的正则表达式匹配的字符串。