POSIX正则表达式
描述:正则表达式是一个字符序列,它是定义一个串集合(一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。表1列出了所有可用于POSIX正则表达式模式匹配的操作符。
表 1 正则表达式匹配操作符
匹配规则:
-
与LIKE不同,正则表达式允许匹配串里的任何位置,除非该正则表达式显式地挂接在串的开头或者结尾。
-
除了上文提到的元字符外, POSIX正则表达式还支持下列模式匹配元字符。
示例:
openGauss=# SELECT 'abc' ~ 'Abc' AS RESULT;
result
--------
f
(1 row)
openGauss=# SELECT 'abc' ~* 'Abc' AS RESULT;
result
--------
t
(1 row)
openGauss=# SELECT 'abc' !~ 'Abc' AS RESULT;
result
--------
t
(1 row)
openGauss=# SELECT 'abc'!~* 'Abc' AS RESULT;
result
--------
f
(1 row)
openGauss=# SELECT 'abc' ~ '^a' AS RESULT;
result
--------
t
(1 row)
openGauss=# SELECT 'abc' ~ '(b|d)'AS RESULT;
result
--------
t
(1 row)
openGauss=# SELECT 'abc' ~ '^(b|c)'AS RESULT;
result
--------
f
(1 row)
虽然大部分的正则表达式搜索都能很快地执行,但是正则表达式仍可能被人为地弄成需要任意长的时间和任意量的内存进行处理。不建议从非安全模式来源接受正则表达式搜索模式,如果必须这样做,建议加上语句超时限制。使用SIMILAR TO模式的搜索具有同样的安全性危险, 因为SIMILAR TO提供了很多和POSIX-风格正则表达式相同的能力。LIKE搜索比其他两种选项简单得多,因此在接受非安全模式来源搜索时要更安全些。
特性补充:目前B库支持的字符序支持右模糊匹配支持索引扫描,会将匹配条件转换为大于等于和小于等于两个不等式作为索引条件。以一个c1 char(10)类型的列举例来说明索引条件转换规则。当我们的查询条件是where c1 like 'sdf%'时,会将索引条件转换为c1 >= 'sdf\min(7 times)' and c1<='sdf\max(7 times)'。其中\min与\max是每种字符序对应的最大排序的字符编码,这样的转换保证我们转换出的索引条件一定是与like 'sdf%'等价的。也是由于这样的转换规则,通过explain打印执行计划的时候,会导致显示不够友好,索引条件中会出现不可视字符,并且由于填充长度可能会很长,会使得执行计划长度较大。