POSIX 运算符
POSIX 正则表达式是指定匹配模式的字符序列。如果字符串是正则表达式描述的正则集的成员,则该字符串与正则表达式匹配。
与 LIKE 和 SIMILAR TO 运算符相比,POSIX 正则表达式提供了更强大的模式匹配手段。POSIX 正则表达式模式可匹配字符串的任何部分,这与 SIMILAR TO 运算符不同,SIMILAR TO 运算符仅当其模式匹配整个字符串时才返回 true。
注意
使用 POSIX 运算符的正则表达式匹配的计算成本高昂。我们建议尽可能使用 LIKE,尤其是在处理非常多的行时。例如,下列查询的功能相同,但使用 LIKE 的查询相比于使用正则表达式的查询的运行速度快若干倍:
select count(*) from event where eventname ~ '.*(Ring|Die).*'; select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
语法
expression [ ! ] ~ pattern
参数
- expression
-
有效的 UTF-8 字符表达式(如列名称)。
- !
-
求反运算符。请不要与正则表达式匹配。
- ~
-
对 expression 的任何子字符串执行区分大小写的匹配。
注意
~~
是 LIKE 的同义词。 - pattern
-
表示正则表达式模式的字符串文本。
如果 pattern 不包含通配符,则模式仅表示字符串本身。
要搜索包含元字符的字符串(如“. * | ?
”等),请使用两个反斜杠(“
\\
”)对字符进行转义。与 SIMILAR TO
和 LIKE
不同,POSIX 正则表达式语法不支持用户定义的转义字符。
其中一个字符表达式可以是 CHAR 或 VARCHAR 数据类型。如果它们不同,Amazon Redshift 会将 pattern 转换为 expression 的数据类型。
所有字符表达式都可以是 CHAR 或 VARCHAR 数据类型。如果表达式的数据类型不同,Amazon Redshift 会将其转换为 expression 的数据类型。
POSIX 模式匹配支持下列元字符:
POSIX | 描述 |
---|---|
. | 匹配任何单个字符。 |
* |
匹配零或多个匹配项。 |
+ |
匹配一个或多个匹配项。 |
? |
匹配零或一个匹配项。 |
| |
指定替换匹配项;例如,
E 表示 或 H 。 |
^ |
匹配行首字符。 |
$ |
匹配行尾字符。 |
$ |
匹配字符串的结尾。 |
[ ] | 括号指定一个匹配列表,它应与列表中的一个表达式匹配。脱字号 (^ ) 位于不匹配列表之前,它与列表中表示的表达式之外的任何字符匹配。 |
( ) |
圆括号将项分组为单个逻辑项。 |
{m} |
重复上一项目正好 m 次。 |
{m,} |
重复上一项目 m 次或更多次。 |
{m,n} |
重复上一项目至少 m 次且不超过 n 次。 |
[: :] |
匹配 POSIX 字符类中的任何字符。在下列字符类中,Amazon Redshift 仅支持 ASCII 字符:[:alnum:] 、[:alpha:] 、[:lower:] 、[:upper:] |
Amazon Redshift 支持下列 POSIX 字符类。
字符类 | 描述 |
---|---|
[[:alnum:]] |
所有 ASCII 字母数字字符 |
[[:alpha:]] |
所有 ASCII 字母字符 |
[[:blank:]] |
所有空格字符 |
[[:cntrl:]] |
所有控制字符(非打印) |
[[:digit:]] |
所有数字 |
[[:lower:]] |
所有小写 ASCII 字母字符 |
[[:punct:]] |
所有标点字符 |
[[:space:]] |
所有空格字符(非打印) |
[[:upper:]] |
所有大写 ASCII 字母字符 |
[[:xdigit:]] |
所有有效的十六进制字符 |
Amazon Redshift 在正则表达式中支持下列受 Perl 影响的运算符。使用两个反斜杠(“\\
”)转义此运算符。
操作符 | 描述 | 等效的字符类表达式 |
---|---|---|
\\d |
数字字符 | [[:digit:]] |
\\D |
非数字字符 | [^[:digit:]] |
\\w |
单词字符 | [[:word:]] |
\\W |
非单词字符 | [^[:word:]] |
\\s |
空格字符 | [[:space:]] |
\\S |
非空格字符 | [^[:space:]] |
\\b |
边界字 |
示例
下表显示了使用 POSIX 运算符的模式匹配的示例:
表达式 | 返回值 |
---|---|
'abc' ~ 'abc' |
True |
'abc' ~ 'a' |
True |
'abc' ~ 'A' |
False |
'abc' ~ '.*(b|d).*' |
True |
'abc' ~ '(b|c).*' |
True |
'AbcAbcdefgefg12efgefg12' ~
'((Ab)?c)+d((efg)+(12))+'
|
True |
'aaaaaab11111xy' ~
'a{6}.[1]{5}(x|y){2}'
|
True |
'$0.87' ~ '\\$[0-9]+(\\.[0-9][0-9])?'
|
True |
'ab c' ~ '[[:space:]]' |
True |
'ab c' ~ '\\s' |
True |
' ' ~ '\\S' |
False |
以下示例查找名称包含 E
或 H
的城市:
SELECT DISTINCT city FROM users WHERE city ~ '.*E.*|.*H.*' ORDER BY city LIMIT 5; city ----------------- Agoura Hills Auburn Hills Benton Harbor Beverly Hills Chicago Heights
以下示例查找名称不包含 E
或 H
的城市:
SELECT DISTINCT city FROM users WHERE city !~ '.*E.*|.*H.*' ORDER BY city LIMIT 5;
city ----------------- Aberdeen Abilene Ada Agat Agawam
以下示例使用转义字符串(“\\
”)搜索包含句点的字符串。
SELECT venuename FROM venue WHERE venuename ~ '.*\\..*' ORDER BY venueid; venuename ------------------------------ St. Pete Times Forum Jobing.com Arena Hubert H. Humphrey Metrodome U.S. Cellular Field Superpages.com Center E.J. Nutter Center Bernard B. Jacobs Theatre St. James Theatre