快速入门
教程
工具和语言
示例
参考
书籍评论
Regex 工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书籍评论
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—The best regex editor and tester for Oracle developers!

Oracle 数据库正则表达式

从 10g 第 1 版开始,Oracle 数据库提供 4 个 regexp 函数,您可以在 SQL 和 PL/SQL 语句中使用这些函数。这些函数实现了 POSIX 扩展正则表达式 (ERE) 标准。Oracle 完全支持 排序序列等价类,用于 方括号表达式。NLS_SORT 设置决定了所使用的 POSIX 区域设置,而区域设置决定了可用的排序序列和等价类。

不过,Oracle 并未完全实现 POSIX ERE 标准。它在三个方面有所不同。首先,Oracle 在正则表达式中支持 反向引用 \1\9。POSIX ERE 标准不支持这些反向引用,尽管 POSIX BRE 支持。在完全兼容的引擎中,\1\9 是非法的。POSIX 标准指出,用反斜杠转义非元字符是非法的。Oracle 允许这样做,并且只是忽略反斜杠。例如,\q 在 Oracle 中与 q 相同。结果是所有 POSIX ERE 正则表达式都可以在 Oracle 中使用,但一些在 Oracle 中有效的正则表达式可能会在完全兼容 POSIX 的引擎中导致错误。显然,如果你只使用 Oracle,这些差异无关紧要。

第三个差异更为微妙。它不会导致任何错误,但可能会导致不同的匹配。正如我在有关 POSIX 标准 的主题中所解释的,它要求正则表达式引擎在交替的情况下返回最长的匹配。Oracle 的引擎不会这样做。它是一个 传统的 NFA 引擎,就像本网站上讨论的所有非 POSIX 正则表达式风格一样。

如果你在其他编程语言中使用过正则表达式,请注意 POSIX 不支持非可打印字符转义,例如制表符的 \t 或换行符的 \n。你可以在 C++ 等编程语言中的 POSIX 引擎中使用它们,因为 C++ 编译器将在字符串常量中解释 \t\n。在 SQL 语句中,你需要在字符串中输入实际的制表符或换行符以及正则表达式才能使其与制表符或换行符匹配。当作为 regexp 参数传递时,Oracle 的正则表达式引擎会将字符串 '\t' 解释为正则表达式 t

Oracle 10g R2 进一步扩展了正则表达式语法,添加了自由间距模式(不支持注释)、简写字符类惰性量词以及锚点 \A\Z\z。Oracle 11g 和 12c 使用与 10g R2 相同的正则表达式风格。

Oracle 的 REGEXP 函数

Oracle Database 10g 提供了四个正则表达式函数。您可以在 SQL 和 PL/SQL 语句中平等地使用它们。

REGEXP_LIKE(source, regexp, modes) 可能您会最常使用的一个函数。您可以在 SELECT 语句的 WHERE 和 HAVING 子句中使用它。在 PL/SQL 脚本中,它返回一个布尔值。您还可以在 CHECK 约束中使用它。source 参数是要与正则表达式匹配的字符串或列。regexp 参数是包含正则表达式的字符串。modes 参数是可选的。它设置匹配模式。

SELECT * FROM mytable WHERE REGEXP_LIKE(mycolumn, 'regexp', 'i');
IF REGEXP_LIKE('subject', 'regexp') THEN /* Match */ ELSE /* No match */ END IF;
ALTER TABLE mytable ADD (CONSTRAINT mycolumn_regexp CHECK (REGEXP_LIKE(mycolumn, '^regexp$')));

REGEXP_SUBSTR(source, regexp, position, occurrence, modes) 返回与正则表达式匹配的 source 部分的字符串。如果匹配尝试失败,则返回 NULL。您可以将 REGEXP_SUBSTR 与单个字符串或列一起使用。您可以在 SELECT 子句中使用它来仅检索列的特定部分。position 参数指定应在其中开始匹配尝试的源字符串中的字符位置。第一个字符的位置为 1。occurrence 参数指定要获取哪个匹配项。将其设置为 1 以获取第一个匹配项。如果您指定一个较大的数字,Oracle 将继续尝试从前一个匹配项的末尾开始匹配正则表达式,直到找到您指定的匹配项数量。然后返回最后一个匹配项。如果匹配项较少,则返回 NULL。不要将此参数与反向引用混淆。Oracle 不提供函数来返回由捕获组匹配的字符串部分。最后三个参数是可选的。

SELECT REGEXP_SUBSTR(mycolumn, 'regexp') FROM mytable;
match := REGEXP_SUBSTR('subject', 'regexp', 1, 1, 'i')

REGEXP_REPLACE(source, regexp, replacement, position, occurrence, modes) 返回用一个或所有正则表达式匹配项替换的源字符串。如果找不到匹配项,则替换原始字符串。如果您为 occurrence 指定一个正数(请参见上文),则仅替换该匹配项。如果您指定 0 或省略该参数,则替换所有匹配项。最后三个参数是可选的。replacement 参数是将用其替换每个正则表达式匹配项的字符串。您可以在替换文本中使用反向引用 \1\9 来重新插入由捕获组匹配的文本。您可以多次引用同一组。没有用于重新插入整个正则表达式匹配项的替换文本标记。要执行此操作,请用圆括号括住整个正则表达式,并在替换中使用 \1。如果您想按字面量插入 \1,请使用字符串 '\\1'。仅当反斜杠后跟数字或另一个反斜杠时才需要转义反斜杠。要按字面量插入 \\,请使用字符串 '\\\\'。虽然 SQL 不要求在字符串中转义反斜杠,但 REGEXP_REPLACE 函数需要。

SELECT REGEXP_REPLACE(mycolumn, 'regexp', 'replacement') FROM mytable;
result := REGEXP_REPLACE('subject', 'regexp', 'replacement', 1, 0, 'i');

REGEXP_INSTR(source, regexp, position, occurrence, return_option, modes) 返回源字符串中正则表达式匹配项的开始或结束位置。此函数采用与 REGEXP_SUBSTR 相同的参数,外加一个参数。将 return_option 设置为 0 或省略该参数以获取匹配项中第一个字符的位置。将其设置为 1 以获取匹配项后第一个字符的位置。字符串中的第一个字符的位置为 1。如果找不到匹配项,REGEXP_INSTR 返回 0。最后 4 个参数是可选的。

SELECT REGEXP_INSTR(mycolumn, 'regexp', 1, 1, 0, 'i') FROM mytable;

REGEXP_COUNT(source, regexp, position, modes) 返回 regex 可以匹配 source 字符串的次数。如果 regex 找不到任何匹配项,则它返回零。此函数仅在 Oracle 11g 及更高版本中可用。

SELECT REGEXP_COUNT(mycolumn, 'regexp', 1, 'i') FROM mytable;

Oracle 的匹配模式

四个 regexp 函数中每个函数接受的 modes 参数应为一个字符串,由四个可能字符中的最多三个字符组成。例如,'i' 启用不区分大小写的匹配,而 'inm' 启用这三个选项。'i''c' 互斥。如果您省略此参数或传递空字符串,则使用默认匹配模式。

进一步阅读

Oracle Regular Expressions Pocket ReferenceO’Reilly 的书 Oracle Regular Expressions Pocket Reference 是一本非常方便的 64 页书,它告诉您在 Oracle Database 10g 中关于正则表达式需要知道的一切。尽管这本书的封面,但它实际上包含教程和参考。由于 Oracle 的正则表达式支持相当有限,因此这本小书是您成功使用 Oracle 正则表达式的全部所需。

我对 Oracle Regular Expressions Pocket Reference 一书的评论

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |