PostgreSQL 模式匹配
- 9.7.1.
LIKE
- 9.7.2.
SIMILAR TO
正则表达式 - 9.7.3. POSIX正则表达式
PostgreSQL提供了三种独立的实现模式匹配的方法:SQL LIKE
操作符、更近一些的SIMILAR TO
操作符(SQL:1999 里添加进来的)和POSIX-风格的正则表达式。除了这些基本的
“这个串匹配这个模式吗?”操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。
提示
如果你的模式匹配的要求超出了这些,请考虑用 Perl 或 Tcl 写一个用户定义的函数。
小心
虽然大部分的正则表达式搜索都能被很快地执行,但是正则表达式仍可能被 人为地弄成需要任意长的时间和任意量的内存进行处理。要当心从不怀好意 的来源接受正则表达式搜索模式。如果必须这样做,建议加上语句超时限制。
使用SIMILAR TO
模式的搜索具有同样的安全性危险, 因为SIMILAR TO
提供了很多和 POSIX-风格正则表达式相同的能力。
LIKE
搜索比其他两种选项简单得多,因此在使用 不怀好意的模式来源时要更安全些。
这三种类型的模式匹配算子都不支持非确定性拼贴。 如果需要的话,可以在表达式中应用不同的拼贴来绕过这个限制。
9.7.1. LIKE
string
LIKE pattern
[ESCAPE escape-character
]
string
NOT LIKE pattern
[ESCAPE escape-character
]
如果该string
匹配了提供的pattern
,那么LIKE
表达式返回真(和预期的一样,如果LIKE
返回真,那么NOT LIKE
表达式返回假, 反之亦然。一个等效的表达式是
NOT (
)。string
LIKE pattern
)
如果pattern
不包含百分号或者下划线,那么该模式只代表它本身的串;这时候LIKE
的行为就象等号操作符。在pattern
里的下划线 (_
)代表(匹配)任何单个字符; 而一个百分号(%
)匹配任何零或更多个字符的序列。
一些例子:
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false
LIKE
模式匹配总是覆盖整个串。因此,要匹配在串内任何位置的序列,该模式必须以百分号开头和结尾。
要匹配文本的下划线或者百分号,而不是匹配其它字符, 在pattern
里相应的字符必须 前导逃逸字符。缺省的逃逸字符是反斜线,但是你可以用ESCAPE
子句指定一个不同的逃逸字符。 要匹配逃逸字符本身,写两个逃逸字符。
注意
如果你关掉了standard_conforming_strings,你在文串常量中写的任何反斜线都需要被双写。详见第 4.1.2.1 节。
请注意反斜线在串文本里已经有特殊含义了,所以如果你写一个 包含反斜线的模式常量,那你就要在 SQL 语句里写两个反斜线。 因此,写一个匹配单个反斜线的模式实际上要在语句里写四个反斜线。 你可以通过用 ESCAPE 选择一个不同的逃逸字符 来避免这样;这样反斜线就不再是 LIKE 的特殊字符了。 但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜线。) 我们也可以通过写ESCAPE ''
的方式不选择逃逸字符,这样可以有效地禁用逃逸机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。
根据SQL标准,省略ESCAPE
意味着没有转义字符(而不是默认为反斜杠),并且不允许使用零长度的ESCAPE
值。 因此,PostgreSQL在这方面的行为有点不标准。
关键字ILIKE
可以用于替换LIKE
, 它令该匹配根据活动区域成为大小写无关。这个不属于SQL标准而是一个PostgreSQL扩展。
操作符~~
等效于LIKE
, 而~~*
对应ILIKE
。 还有 !~~
和!~~*
操作符分别代表NOT LIKE
和
NOT ILIKE
。 所有这些操作符都是PostgreSQL特有的。 你可能会在EXPLAIN
输出和类似的地方看到这些操作符名称,因为解析器实际上将LIKE
等翻译成这些运算符。
短语LIKE
,ILIKE
,NOT LIKE
,和 NOT ILIKE
在PostgreSQL语法中通常被视为操作符; 例如,它们可以用于expression
operator
的任何(subquery
)构造,尽管这里不能包含ESCAPE
子句。 在某些晦涩难懂的情况下,可能需要用底层操作符名称替代。
还可参见前缀操作符^@
和相应的starts_with
函数,在需要简单匹配字符串开头的情况下比较有用。
9.7.2. SIMILAR TO
正则表达式
string
SIMILAR TO pattern
[ESCAPE escape-character
]
string
NOT SIMILAR TO pattern
[ESCAPE escape-character
]
SIMILAR TO
操作符根据自己的模式是否匹配给定串而返回真或者假。 它和LIKE
非常类似,只不过它使用 SQL 标准定义的正则表达式理解模式。 SQL 正则表达式是在LIKE
标记和普通的(POSIX)正则表达式标记的奇怪的杂交。
类似LIKE
,SIMILAR TO
操作符只有在它的模式匹配整个串的时候才能成功;这一点和普通的 正则表达式的行为不同,在普通的正则表达式里,模式匹配串的任意部分。 和LIKE
类似的地方还有,SIMILAR TO
使用_
和
%
作为分别代表任意单个字符和任意串的通配符(这些可以比得上 POSIX 正则表达式里的.
和.*
)。
除了这些从LIKE
借用的功能之外,SIMILAR TO
支持下面这些从 POSIX 正则表达式借用的 模式匹配元字符:
-
|
表示选择(两个候选之一)。 -
*
表示重复前面的项零次或更多次。 -
+
表示重复前面的项一次或更多次。 -
?
表示重复前面的项零次或一次。 -
{
m
}
表示重复前面的项刚好m
次。 -
{
m
,}
表示重复前面的项m
次或更多次。 -
{
m
,
n
}
表示重复前面的项至少m
次并且不超过n
次。 -
可以使用圆括号
()
把多个项组合成一个逻辑项。 -
一个方括号表达式
[...]
声明一个字符类,就像 POSIX 正则表达式一样。
注意点号(.
)不是SIMILAR TO
的一个元字符。
与LIKE
一样,反斜杠将禁用这些元字符的特殊含义。 可以用 ESCAPE
来指定不同的转义字符,或者可以通过写 ESCAPE ''
来禁用转义功能。
根据SQL标准,省略ESCAPE
意味着没有转义字符(而不是默认为反斜杠),并且不允许使用零长度的ESCAPE
值。 PostgreSQL在这方面的行为有点不标准。
另一个非标准扩展是,在转义字符后面跟着一个字母或数字提供了对为POSIX正则表达式定义的转义序列的访问;参见下面的 表 9.20,表 9.21,和 表 9.22 。
一些例子:
'abc' SIMILAR TO 'abc' true
'abc' SIMILAR TO 'a' false
'abc' SIMILAR TO '%(b|d)%' true
'abc' SIMILAR TO '(b|c)%' false
'-abc-' SIMILAR TO '%mabcM%' true
'xabcy' SIMILAR TO '%mabcM%' false
带有三个参数的substring
函数可以提取匹配SQL正则表达式模式的子字符串。 该函数可以按照SQL99语法编写。
substring(string from
pattern for escape-character)
或作为一个普通的三参数函数:
substring(string, pattern, escape-character)
与SIMILAR TO
一样,指定的模式必须与整个数据字符串匹配,否则函数失败并返回空值。 为了表示匹配的数据子字符串的模式中,模式中应该包含两个转义字符的出现,并在后面加上一个双引号("
)。 匹配成功后,将返回与这些分隔符之间的模式部分匹配的文本。
转义-双引号分隔符实际上是 将子字符串
的模式分成三个独立的 正则表达式;例如,竖条(|
) 三节中的任何一节只影响到该节。 此外,第一节和第三种正则表达式的定义是为了匹配最小的 尽可能多的文字,而不是最大的文字,当有歧义的时候,就不应该是最大的文字。关于有多少数据字符串符合哪种模式。 (在POSIX术语中,第一和第三种正则表达式被强行规定为非贪婪)。
作为对SQL标准的扩展,PostgreSQL只允许有一个转义双引号分隔符,在这种情况下,第三个正则表达式被视为空;或者没有分隔符,在这种情况下,第一个和第三个正则表达式被视为空。
一些例子,使用#"
定界返回串:
substring('foobar' from '%#"o_b#"%' for '#') oob
substring('foobar' from '#"o_b#"%' for '#') NULL
9.7.3. POSIX正则表达式
表 9.16列出了所有可用于 POSIX 正则表达式模式匹配的操作符。
表 9.16. 正则表达式匹配操作符
操作符 描述 例子 |
---|
字符串匹配正则表达式,大小写敏感 |
字符串匹配正则表达式,大小写不敏感 |
字符串不匹配正则表达式,大小写敏感 |
字符串不匹配正则表达式,大小写不敏感 |
POSIX正则表达式提供了比LIKE
和SIMILAR TO
操作符更强大的含义。许多 Unix 工具,例如egrep
、sed
或awk
使用一种与我们这里描述的类似的模式匹配语言。
正则表达式是一个字符序列,它是定义一个串集合 (一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 和LIKE
一样,模式字符准确地匹配串字符, 除非在正则表达式语言里有特殊字符 — 不过正则表达式用的 特殊字符和LIKE
用的不同。 和LIKE
模式不一样的是,正则表达式允许匹配串里的任何位置,除非该正则表达式显式地挂接在串的开头或者结尾。
一些例子:
'abc' ~ 'abc' true
'abc' ~ '^a' true
'abc' ~ '(b|d)' true
'abc' ~ '^(b|c)' false
POSIX模式语言的详细描述见下文。
带两个参数的substring
函数,即substring(
,提供了抽取一个匹配 POSIX 正则表达式模式的子串的方法。如果没有匹配它返回空值,否则就是文本中匹配模式的那部分。 但是如果该模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果你想在表达式里使用圆括号而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括号。 如果你需要在想抽取的子表达式前有圆括号,参阅后文描述的非捕获性圆括号。string
from pattern
)
一些例子:
substring('foobar' from 'o.b') oob
substring('foobar' from 'o(.)b') o
regexp_replace
函数提供了将匹配 POSIX 正则表达式模式的子串替换为新文本的功能。 它的语法是 regexp_replace
(source
, pattern
, replacement
[
, flags
])。 如果没有匹配pattern
,那么返回不加修改的source
串。 如果有匹配,则返回的source
串里面的匹配子串将被replacement
串替换掉。
replacement
串可以包含n
, 其中n
是 1 到 9, 表明源串里匹配模式里第n
个圆括号子表达式的子串应该被插入, 并且它可以包含&
表示应该插入匹配整个模式的子串。如果你需要放一个文字形式的反斜线在替换文本里,那么写
。
flags
参数是一个可选的文本串,它包含另个或更多单字母标志,这些标志可以改变函数的行为。标志i
指定大小写无关的匹配,而标志g
指定替换每一个匹配的子串而不仅仅是第一个。支持的标志(但不是g
)在表 9.24中描述。
一些例子:
regexp_replace('foobarbaz', 'b..', 'X')
fooXbaz
regexp_replace('foobarbaz', 'b..', 'X', 'g')
fooXX
regexp_replace('foobarbaz', 'b(..)', 'X1Y', 'g')
fooXarYXazY
regexp_match
返回一个文本数组,它包含一个POSIX正则表达式模式与一个字符串第一个匹配所得到的子串。其语法是regexp_match
(string
, pattern
[, flags
])。如果没有匹配,则结果为
NULL
。如果找到一个匹配并且pattern
不包含带括号的子表达式,那么结果是一个单一元素的文本数组,其中包含匹配整个模式的子串。如果找到一个匹配并且pattern
含有带括号的子表达式,那么结果是一个文本数组,其中第n
个元素是与
pattern
的第n
个圆括号子表达式匹配的子串(“非捕获”圆括号不计入在内,详见下文)。flags
参数是一个可选的文本字符串,它包含零个或者更多个可以改变该函数行为的单字母标志。所支持的标志在表 9.24中介绍。
一些例子:
SELECT regexp_match('foobarbequebaz', 'bar.*que');
regexp_match
--------------
{barbeque}
(1 row)
SELECT regexp_match('foobarbequebaz', '(bar)(beque)');
regexp_match
--------------
{bar,beque}
(1 row)
在通常情况下,人们只是想要的大整个匹配的子串或者NULL
(没有匹配),可以写成这样
SELECT (regexp_match('foobarbequebaz', 'bar.*que'))[1];
regexp_match
--------------
barbeque
(1 row)
regexp_matches
函数返回一个文本数组的集合,其中包含着一个POSIX正则表达式模式与一个字符串匹配得到的子串。它和regexp_match
具有相同的语法。如果没有匹配,这个函数不会返回行。如果有一个匹配并且给定了g
标志,则返回一行。如果有N
个匹配并且给定了
g
标志,则返回N
行。每一个返回的行都是一个文本数组,其中含有整个匹配的子串或者匹配pattern
的圆括号子表达式的子串,这和上面对regexp_match
的介绍一样。regexp_matches
接受
表 9.24中展示的所有标志,外加令它返回所有匹配而不仅仅是第一个匹配的g
标志。
一些例子:
SELECT regexp_matches('foo', 'not there');
regexp_matches
----------------
(0 rows)
SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
regexp_matches
----------------
{bar,beque}
{bazil,barf}
(2 rows)
提示
在大部分情况下,regexp_matches()
应该与g
标志一起使用,因为如果只是想要第一个匹配,使用regexp_match()
会更加简单高效。不过,regexp_match()
仅存在于PostgreSQL版本10以及更高的版本中。当在较老的版本中使用时,一种常用的技巧是把
regexp_matches()
调用放在子选择中,例如:
SELECT col1, (SELECT regexp_matches(col2, '(bar)(beque)')) FROM tab;
如果有一个匹配,则这个语句会产生一个文本数组,否则返回NULL
,这和regexp_match()
的做法一样。如果没有子选择,这个查询对于没有匹配的表行根本不会产生输出,显然那不是想要的行为。
regexp_split_to_table
把一个 POSIX 正则表达式模式当作一个定界符来分离一个串。它的语法形式是regexp_split_to_table
(string
, pattern
[, flags
])。如果没有与
pattern
的匹配,该函数返回string
。如果有至少有一个匹配,对每一个匹配它都返回从上一个匹配的末尾(或者串的开头)到这次匹配开头之间的文本。当没有更多匹配时,它返回从上一次匹配的末尾到串末尾之间的文本。flags
参数是一个可选的文本串,它包含零个或更多单字母标志,这些标识可以改变该函数的行为。regexp_split_to_table
能支持的标志在
表 9.24中描述。
regexp_split_to_array
函数的行为和regexp_split_to_table
相同,不过regexp_split_to_array
会把它的结果以一个text
数组的形式返回。它的语法是regexp_split_to_array
(
string
, pattern
[, flags
])。这些参数和regexp_split_to_table
的相同。
一些例子:
SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', 's+') AS foo;
foo
-------
the
quick
brown
fox
jumps
over
the
lazy
dog
(9 rows)
SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', 's+');
regexp_split_to_array
-----------------------------------------------
{the,quick,brown,fox,jumps,over,the,lazy,dog}
(1 row)
SELECT foo FROM regexp_split_to_table('the quick brown fox', 's*') AS foo;
foo
-----
t
h
e
q
u
i
c
k
b
r
o
w
n
f
o
x
(16 rows)
正如上一个例子所示,正则表达式分离函数会忽略零长度的匹配,这种匹配发生在串的开头或结尾或者正好发生在前一个匹配之后。这和正则表达式匹配的严格定义是相悖的,后者由regexp_match
和regexp_matches
实现,但是通常前者是实际中最常用的行为。其他软件系统如Perl也使用相似的定义。
9.7.3.1. 正则表达式细节
PostgreSQL的正则表达式是使用 Henry Spencer 写的一个包来实现的。下面的正则表达式的大部分描述都是从他的手册页中逐字拷贝过来的。
正则表达式(RE),在POSIX 1003.2 中定义, 它有两种形式:扩展的RE或者是ERE(大概地说就是那些在egrep
里的),
基本的RE或者是BRE(大概地说就是那些在ed
里的)。PostgreSQL支持两种形式,并且还实现了一些POSIX标准中没有但是在类似 Perl 或者 Tcl 这样的语言中得到广泛应用的一些扩展。使用了那些非POSIX扩展的
RE叫高级RE, 或者本文档里说的ARE。ARE 几乎完全是 ERE 的超集,但是 BRE 有几个符号上的不兼容(以及更多的限制)。我们首先描述 ARE 和 ERE 形式, 描述那些只适用于 ARE 的特性,然后描述 BRE 的区别是什么。
注意
PostgreSQL初始时总是推测一个正则表达式遵循 ARE 规则。但是,可以通过为 RE 模式预置一个embedded option来选择限制更多的 ERE 或 BRE 规则,如本文中第 9.7.3.4 节中所述。这对为期望准确的 POSIX1003.2 规则的应用提供兼容性很有用。
一个正则表达式被定义为一个或更多分支,它们之间被|
分隔。只要能匹配其中一个分支的东西都能匹配正则表达式。
一个分支是一个或多个量化原子或者约束连接而成。一个原子匹配第一个,然后后面的原子匹配第二个, 以此类推;一个空分支匹配空串。
一个量化原子是一个原子, 后面可能跟着一个量词。没有量词的时候,它匹配一个原子, 有量词的时候,它可以匹配若干个原子。一个原子可以是在表 9.17里面显示的任何可能。 可能的量词和它们的含义在表 9.18里显示。
一个约束匹配一个空串,但只是在满足特定条件下才匹配。 约束可以在能够使用原子的地方使用,只是它不能跟着量词。简单的约束在表 9.19里显示; 更多的约束稍后描述。
表 9.17. 正则表达式原子
原子 | 描述 |
---|---|
( re )
|
(其中re 是任何正则表达式) 匹配一个对re 的匹配,匹配将为可能的报告被记下 |
(?: re )
|
同上,但是匹配不会为了报告而被记下 (一个“非捕获”圆括号集) (只对 ARE) |
.
|
匹配任意单个字符 |
[ chars ]
|
一个方括号表达式, 匹配chars 中的任意一个(详见第 9.7.3.2 节) |
k
|
(其中k 是一个非字母数字字符) 匹配一个被当作普通字符看待的特定字符, 例如, 匹配一个反斜线字符 |
c
|
其中c 是一个字母数字 (可能跟着其它字符),它是一个逃逸, 参阅第 9.7.3.3 节(仅对 ARE; 在 ERE 和 BRE 中,它匹配
c
) |
{
|
如果后面跟着一个字符,而不是数字, 那么就匹配左花括弧{ ;如果跟着一个数字, 那么它是range 的开始(见下文) |
x
|
其中x 是一个没有其它意义的单个字符,则匹配该字符 |
RE 不能以反斜线()结尾。
注意
如果你关掉了standard_conforming_strings,任何你写在文字串常量中的反斜线都需要被双写。详见第 4.1.2.1 节。
表 9.18. 正则表达式量词
量词 | 匹配 |
---|---|
*
|
一个由原子的 0 次或更多次匹配组成的序列 |
+
|
一个由原子的 1 次或更多次匹配组成的序列 |
?
|
一个由原子的 0 次或 1 次匹配组成的序列 |
{ m }
|
一个由原子的正好m 次匹配组成的序列 |
{ m ,}
|
一个由原子的m 次或更多次匹配组成的序列 |
{ m , n }
|
一个由原子的从m 次到n 次(包括)匹配组成的序列;m 不能超过n
|
*?
|
* 的非贪婪版本 |
+?
|
+ 的非贪婪版本 |
??
|
? 的非贪婪版本 |
{ m }?
|
{ m } 的非贪婪版本 |
{ m ,}?
|
{ m ,} 的非贪婪版本 |
{ m , n }?
|
{ m , n } 的非贪婪版本 |
使用{
...
}
的形式被称作范围。 一个范围内的数字m
和n
都是无符号十进制整数,
允许的数值从 0 到 255(包含)。
非贪婪的量词(只在 ARE 中可用)匹配对应的正常 (贪婪)模式,区别是它寻找最少的匹配,而不是最多的匹配。详见第 9.7.3.5 节。
注意
一个量词不能紧跟在另外一个量词后面,例如**
是非法的。量词不能作为表达式或者子表达式的开头,也不能跟在^
或者|
后面。
表 9.19. 正则表达式约束
约束 | 描述 |
---|---|
^
|
串开头的匹配 |
$
|
串末尾的匹配 |
(?= re )
|
在匹配re 的子串开始的任何点的positive lookahead匹配(只对 ARE) |
(?! re )
|
在匹配re 的子串开始的任何点的negative lookahead匹配(只对 ARE) |
(?<= re )
|
只要有一个点上有一个子串匹配re 端, positive lookbehind就在这个点上匹配(只对 ARE) |
(?<! re )
|
只要有一个点上没有子串匹配re 端, negative lookbehind就在这个点上匹配(只对 ARE) |
Lookahead 和 lookbehind 约束不能包含后引用 (参阅第 9.7.3.3 节),并且其中的所有圆括号 都被认为是非捕获的。
9.7.3.2. 方括号表达式
方括号表达式是一个包围在[]
中的字符列表。它通常匹配列表中的任意单个字符(但见下文)。 如果列表以^
开头,它匹配任意单个不在该列表参与部分中的字符。如果该列表中两个字符用-
隔开, 那它就是那两个字符(包括在内)之间的所有字符范围的缩写,例如,在
ASCII中[0-9]
匹配任何十进制数字。两个范围共享一个端点是非法的,例如,a-c-e
。范围与字符集关系密切, 可移植的程序应该避免依靠它们。
想在列表中包含文本]
,可以让它做列表的首字符(如果使用了^
,需要放在其后)。 想在列表中包含文本-
,可以让它做列表的首字符或者尾字符,或者一个范围的第二个端点。 想在列表中把文本-
当做范围的起点, 把它用[.
和
.]
包围起来,这样它就成为一个排序元素(见下文)。 除了这些字符本身、一些用[
的组合(见下段)以及逃逸(只在 ARE 中有效)以外,所有其它特殊字符 在方括号表达式里都失去它们的特殊含义。特别是,在 ERE 和 BRE 规则下不是特殊的, 但在 ARE 里,它是特殊的(引入一个逃逸)。
在一个方括号表达式里,一个排序元素(一个字符、一个被当做一个单一字符排序的多字符序列或者一个表示上面两种情况的排序序列名称) 包含在[.
和.]
里面的时候表示该排序元素的字符序列。该序列被当做该方括号列表 的一个单一元素。这允许一个包含多字符排序元素的方括号表达式去匹配多于一个字符,例如,如果排序序列包含一个ch
排序元素, 那么
RE [[.ch.]]*c
匹配chchcc
的头五个字符。
注意
PostgreSQL当前不支持多字符排序元素。这些信息描述了将来可能有的行为。
在方括号表达式里,包围在[=
和=]
里的排序元素是一个等价类, 代表等效于那一个的所有排序元素的字符序列,包括它本身(如果没有其它等效排序元素,那么就好象封装定界符是[.
和 .]
)。例如,如果o
和
^
是一个等价类的成员,那么[[=o=]]
、[[=^=]]
和[o^]
都是同义的。一个等价类不能是一个范围的端点。
在方括号表达式里,在[:
和:]
里面封装的字符类的名字代表属于该类的所有字符的列表。 字符类不能作为范围的端点使用。POSIX标准定义了这些字符类的名称: alnum
(字符和数字), alpha
(字符),
blank
(空格和制表符tab), cntrl
(控制符), digit
(数位数), graph
(空格除外可打印字符), lower
(小写字母), print
(包含空格可打印字符), punct
(标点符号),
space
(空白), upper
(大写字母), 和 xdigit
(十六进制数). 对于7位ASCII字符集中的字符来说,这些标准字符类的行为在不同平台上一般是一致的。一个给定的非ASCII字符是否被认为属于这些类别中的一个,取决于正则表达式函数或运算符使用的collation(见第 23.2 节),或者默认情况下取决于数据库的LC_CTYPE
locale设置(见第 23.1 节)。非ASCII字符的分类在不同的平台上会有不同的分类,即使是在类似命名的locale中也是如此。 (但C
locale从不认为任何非ASCII字符属于上述任何一类)。除了这些标准字符类之外,
PostgreSQL定义了ascii
字符类,它完全包含7位ASCII字符集。
方括号表达式里有两个特例:方括号表达式[[:<:]]
和[[:>:]]
是约束,分别匹配一个单词开头和结束的空串。 单词定义为一个单词字符序列,前面和后面都没有其它单词字符。单词字符是一个alnum
字符(和如上所述POSIX字符类中定义的一样) 或者一个下划线。这是一个扩展,兼容
POSIX1003.2, 但那里面并没有说明, 而且在准备移植到其他系统里去的软件里一定要小心使用。通常下文描述的约束逃逸更好些(它们并非更标准,但是更容易键入)。
9.7.3.3. 正则表达式逃逸
逃逸是以开头,后面跟着一个字母数字字符得特殊序列。 逃逸有好几种变体:字符项、类缩写、约束逃逸以及后引用。在 ARE 里, 如果一个
后面跟着一个字母数字,但是并未组成一个合法的逃逸, 那么它是非法的。在 ERE 中没有逃逸:在方括号表达式之外,一个后面跟着字母数字字符的
只是表示该字符是一个普通的字符,而且在一个方括号表达式里,
是一个普通的字符(后者实际上在 ERE 和 ARE 不兼容)。
字符项逃逸用于便于我们在 RE 中声明那些不可打印的或其他习惯的字符。它们显示在表 9.20中。
类缩写逃逸用来提供一些常用的字符类缩写。它们显示在表 9.21中。
约束逃逸是一个约束,如果满足特定的条件,它匹配该空串。它们显示在表 9.22中。
后引用(n
)匹配数字n
指定的被前面的圆括号子表达式匹配的同一个串 (参阅表 9.23)。例如, ([bc])1
匹配bb
或者cc
, 但是不匹配bc
或者cb
。RE 中子表达式必须完全在后引用前面。子表达式以它们的先导圆括号的顺序编号。非捕获圆括号并不定义子表达式。
表 9.20. 正则表达式字符项逃逸
逃逸 | 描述 |
---|---|
a
|
警告(响铃)字符,和 C 中一样 |
b
|
退格,和 C 中一样 |
B
|
反斜线( )的同义词,用来减少双写反斜线 |
c X
|
(其中X 是任意字符)低序5位和X 相同的字符,它的其他位都是零 |
e
|
排序序列名为ESC 的字符,如果无法做到该字符为八进制值 033
|
f
|
换页,和 C 中一样 |
n
|
新行,和 C 中一样 |
r
|
回车,和 C 中一样 |
t
|
水平制表符,和 C 中一样 |
u wxyz
|
(其中wxyz 正好是四个十六进制位)十六进制值为0x wxyz 的字符 |
U stuvwxyz
|
(其中stuvwxyz 正好是八个十六进制位)十六进制值为0x stuvwxyz 的字符 |
v
|
垂直制表符,和 C 中一样 |
x hhh
|
(其中hhh 是十六进制位的任意序列)十六进制值为0x hhh 的字符(一个单一字符,不管用了多少个十六进制位) |
|