首页 > 数据库 > > 函数和操作符-模式匹配操作符
数据库提供了三种独立的实现模式匹配的方法:SQL LIKE操作符、SIMILAR TO操作符和POSIX-风格的正则表达式。除了这些基本的操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。
描述:判断字符串是否能匹配上LIKE后的模式字符串。如果字符串与提供的模式匹配,则LIKE表达式返回为真(NOT LIKE表达式返回假),否则返回为假(NOT LIKE表达式返回真)。
说明:参数standard_conforming_strings设置为off时,在文串常量中写的任何反斜线都需要被双写。因此,写一个匹配单个反斜线的模式实际上要在语句里写四个反斜线。(你可以通过用ESCAPE选择一个不同的逃逸字符来避免这种情况,这样反斜线就不再是LIKE的特殊字符了。但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜线。)我们也可以通过写ESCAPE ''的方式不选择逃逸字符,这样可以有效地禁用逃逸机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。
示例:
SELECT 'abc' LIKE 'abc' AS RESULT;
result
-----------
t
(1 row)
SELECT 'abc' LIKE 'a%' AS RESULT;
result
-----------
t
(1 row)
SELECT 'abc' LIKE '_b_' AS RESULT;
result
-----------
t
(1 row)
SELECT 'abc' LIKE 'c' AS RESULT;
result
-----------
f
(1 row)
描述:SIMILAR TO操作符根据自己的模式是否匹配给定串而返回真或者假。他和LIKE非常类似,只不过他使用SQL标准定义的正则表达式理解模式。
元字符 | 含义 |
|---|---|
| | 表示选择(两个候选之一) |
* | 表示重复前面的项零次或更多次 |
+ | 表示重复前面的项一次或更多次 |
? | 表示重复前面的项零次或一次 |
{m} | 表示重复前面的项刚好m次 |
{m,} | 表示重复前面的项m次或更多次 |
{m,n} | 表示重复前面的项至少m次并且不超过n次 |
() | 把多个项组合成一个逻辑项 |
[...] | 声明一个字符类,就像POSIX正则表达式一样 |
正则表达式函数:
支持使用函数substring(string from pattern for escape)截取匹配SQL正则表达式的子字符串。
示例:
SELECT 'abc' SIMILAR TO 'abc' AS RESULT;
result
-----------
t
(1 row)
SELECT 'abc' SIMILAR TO 'a' AS RESULT;
result
-----------
f
(1 row)
SELECT 'abc' SIMILAR TO '%(b|d)%' AS RESULT;
result
-----------
t
(1 row)
SELECT 'abc' SIMILAR TO '(b|c)%' AS RESULT;
result
-----------
f
(1 row)
描述:正则表达式是一个字符序列,它是定义一个串集合 (一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。表 1 正则表达式匹配操作符列出了所有可用于POSIX正则表达式模式匹配的操作符。
操作符 | 描述 | 例子 |
|---|---|---|
~ | 匹配正则表达式,大小写敏感 | 'thomas' ~ '.*thomas.*' |
~* | 匹配正则表达式,大小写不敏感 | 'thomas' ~* '.*Thomas.*' |
!~ | 不匹配正则表达式,大小写敏感 | 'thomas' !~ '.*Thomas.*' |
!~* | 不匹配正则表达式,大小写不敏感 | 'thomas' !~* '.*vadim.*' |
元字符 | 含义 |
|---|---|
^ | 表示串开头的匹配 |
$ | 表示串末尾的匹配 |
. | 匹配任意单个字符 |
正则表达式函数:
说明:正则表达式分离函数会忽略零长度的匹配,这种匹配发生在串的开头或结尾或者正好发生在前一个匹配之后。这和正则表达式匹配的严格定义是相悖的,后者由regexp_matches实现,但是通常前者是实际中最常用的行为。
示例:
SELECT 'abc' ~ 'Abc' AS RESULT;
result
--------
f
(1 row)
SELECT 'abc' ~* Abc' AS RESULT;
result
--------
t
(1 row)
SELECT 'abc' !~ 'Abc' AS RESULT;
result
--------
t
(1 row)SELECT 'abc'!~* 'Abc' AS RESULT;
result
--------
f
(1 row)
SELECT 'abc' ~ '^a' AS RESULT;
result
--------
t
(1 row)
SELECT 'abc' ~ '(b|d)'AS RESULT;
result
--------
t
(1 row)
SELECT 'abc' ~ '^(b|c)'AS RESULT;
result
--------
f
(1 row)
虽然大部分的正则表达式搜索都能很快地执行,但是正则表达式仍可能被人为地弄成需要任意长的时间和任意量的内存进行处理。不建议从非安全模式来源接受正则表达式搜索模式,如果必须这样做,建议加上语句超时限制。使用SIMILAR TO模式的搜索具有同样的安全性危险, 因为SIMILAR TO提供了很多和POSIX-风格正则表达式相同的能力。LIKE搜索比其他两种选项简单得多,因此在接受非安全模式来源搜索时要更安全些。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3148632/ ,如需转载,请注明出处,否则将追究法律责任。