正则表达式工具 |
grep |
语言和函数库 |
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 |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
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 未提供的功能,它们并不会更复杂。
波浪号操作符
波浪号中缀操作符会传回 true 或 false,具体取决于正则表达式是否可以比对字符串的一部分。例如,'subject' ~ 'regexp'
传回 false,而 'subject' ~ '\\w'
传回 true。如果正则表达式必须比对整个字符串,您需要使用 锚点。例如,'subject' ~ '^\\w$'
传回 false,而 'subject' ~ '^\\w+$'
传回 true。此操作符有 4 种变化
~
尝试进行大小写敏感的比对~*
尝试进行不区分大小写的比对!~
尝试进行区分大小写的比对,如果正则表达式与主旨字符串的任何部分不符,则传回 true!~*
尝试进行不区分大小写的比对,如果正则表达式与主旨字符串的任何部分不符,则传回 true
虽然只有区分大小写可以由操作符切换,但所有其他选项都可以在正则表达式的开头使用 模式修改器 来设置。模式修改器会覆写操作符类型。例如,‘(?c)regex’ 强制 regex 区分大小写。
此操作符最常见的用法是根据字段是否符合正则表达式来选取列,例如
select * from mytable where mycolumn ~* 'regexp'
正则表达式作为 PostgreSQL 文本字符串
反斜线用于转义 PostgreSQL 字符串中的字符。因此,包含反斜线的正则表达式,例如 \w
,在写成 PostgreSQL 陈述式中的文本字符串时会变成 '\\w'
。若要比对单一文本反斜线,您需要正则表达式 \\
,在 PostgreSQL 中会变成 '\\\\'
。
PostgreSQL Regexp 函数
使用 substring(字符串 from 样式)
函数,您可以截取字符串或字段的部分。它需要两个参数:您要从中截取文本的字符串,以及截取的文本应符合的样式。如果没有比对,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(主旨, 样式, 替换 [, 旗标])
,您可以在字符串中替换正则表达式比对。如果您省略旗标参数,则正则表达式会区分大小写地套用,且只会替换第一个比对。如果您将旗标设置为 '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])
会将分割的字符串传回为一个文本数组。如果正则表达式找不到任何比对,这两个函数都会传回主旨字符串。