快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
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 Feed 和博客
RegexBuddy—The best regex editor and tester for PostgreSQL developers!

PostgreSQL 有三种正则表达式风格

PostgreSQL 7.4 及更高版本使用 Henry Spencer 为 Tcl 8.2 开发的完全相同的正则表达式引擎。这意味着 PostgreSQL 支持相同的三种正则表达式风格:Tcl 高级正则表达式POSIX 扩展正则表达式POSIX 基本正则表达式。与 Tcl 中一样,ARE 是默认值。我对 Tcl 的正则表达式风格的所有评论,如不寻常的模式修饰符和单词边界标记,完全适用于 PostgreSQL。如果你不熟悉 Tcl 的 ARE,你绝对应该查看它们。不过,不幸的是,PostgreSQL 的 regexp_replace 函数不使用与 Tcl 的 regsub 命令相同的替换文本语法。

7.4 之前的 PostgreSQL 版本仅支持 POSIX 扩展正则表达式。如果你要将旧数据库代码迁移到新版本的 PostgreSQL,你可以将 PostgreSQL 的“regex_flavor”运行时参数设置为“extended”,而不是默认的“advanced”,以使 ERE 成为默认值。

PostgreSQL 还支持传统的 SQL LIKE 运算符和 SQL:1999 SIMILAR TO 运算符。它们使用自己的模式语言,这里不讨论。ARE 强大得多,如果你不使用 LIKE 或 SIMILAR TO 不提供的功能,它们并不复杂。

波浪号运算符

波浪号中缀运算符返回真或假,具体取决于正则表达式是否可以匹配字符串的一部分。例如,'subject' ~ 'regexp' 返回假,而 'subject' ~ '\\w' 返回真。如果正则表达式必须匹配整个字符串,则需要使用 锚点。例如,'subject' ~ '^\\w$' 返回假,而 'subject' ~ '^\\w+$' 返回真。此运算符有 4 种变体

虽然只有大小写敏感性可以通过运算符切换,但所有其他选项都可以使用正则表达式开头的 模式修饰符 设置。模式修饰符覆盖运算符类型。例如,“(?c)regex”强制正则表达式区分大小写。

此运算符最常见的用法是根据列是否匹配正则表达式来选择行,例如

select * from mytable where mycolumn ~* 'regexp'

正则表达式作为 PostgreSQL 字符串文字

反斜杠用于转义 PostgreSQL 字符串中的字符。因此,包含反斜杠的正则表达式(如 \w)在作为 PostgreSQL 语句中的字符串文字编写时变为 '\\w'。若要匹配单个反斜杠,您需要正则表达式 \\,在 PostgreSQL 中变为 '\\\\'

PostgreSQL 正则表达式函数

使用 substring(string from pattern) 函数,您可以提取字符串或列的一部分。它有两个参数:您想要从中提取文本的字符串和提取的文本应匹配的模式。如果没有匹配项,substring() 返回 null。例如,substring('subject' from 'regexp') 返回 null。如果存在匹配项,并且正则表达式有一个或多个 捕获组,则返回第一个捕获组匹配的文本。例如,substring('subject' from 's(\\w)') 返回“u”。如果存在匹配项,但正则表达式没有捕获组,则返回整个正则表达式匹配项。例如,substring('subject' from 's\\w') 返回“su”。如果正则表达式匹配字符串多次,则仅返回第一个匹配项。由于 substring() 函数不接受“标志”参数,因此您需要使用 模式修饰符 切换任何匹配选项。

此函数特别适用于从列中提取信息。例如,要为每一行从列 mycolumn 中提取第一个数字,请使用

select substring(mycolumn from '\d+') from mytable

使用 regexp_replace(subject, pattern, replacement [, flags]),您可以在字符串中替换正则表达式匹配项。如果您省略 flags 参数,则正则表达式将区分大小写地应用,并且只替换第一个匹配项。如果您将 flags 设置为 'i',则正则表达式将不区分大小写地应用。'g' 标志(表示“全局”)将导致替换字符串中的所有正则表达式匹配项。您可以将这两个标志组合为 'gi'

您可以在替换文本中使用反向引用 \1\9,以将正则表达式中捕获组匹配的文本重新插入到正则表达式中。\& 重新插入整个正则表达式匹配项。请记住在文字字符串中将反斜杠加倍。

例如,regexp_replace('subject', '(\w)\w', '\&\1', 'g') 返回 'susbjbecet'

PostgreSQL 8.3 及更高版本有两个新函数,可沿着正则表达式匹配项拆分字符串。regexp_split_to_table(subject, pattern[, flags]) 将拆分的字符串作为新表返回。regexp_split_to_array(subject, pattern[, flags]) 将拆分的字符串作为文本数组返回。如果正则表达式没有找到任何匹配项,这两个函数都将返回 subject 字符串。

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

| 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 |