PostgreSQL 正则表达式

时间:2024-11-03 13:16:30

PostgreSQL 正则表达式
~       匹配正则表达式,区分大小写       'thomas' ~ '.*thomas.*'
~*      匹配正则表达式,大小写无关       'thomas' ~* '.*Thomas.*'
!~      不匹配正则表达式,区分大小写     'thomas' !~ '.*Thomas.*'
!~*     不匹配正则表达式,大小写无关     'thomas' !~* '.*vadim.*'

举例:
select * from actor where last_name ~ 'N'; 查找 last_name 含 '.*N.*' 的

园括号的的正则表达式:如果正则表达式包含任何圆括号,那么将返回匹配第一对子表达式对应第一个左圆括号的的文本
substring('foobar' from 'o.b')     结果:oob
substring('foobar' from 'o(.)b')   结果:o

|       标识选择(两个候选之一)              如:  a|b  可匹配 a 或 b
*       表示重复前面的项零次或更多次         如:  a*   可匹配 a、aa、aaaa...
+       表示重复前面的项一次或更多次         如:  a+   可匹配 aa、aaa、aaaa...
()      可以使用圆括弧 () 把项组合成一个逻辑项
?       匹配 0 个或者 1 个原子的序列        如:  a?   可匹配 a、aaa、aaaa
*?      * 的非贪婪模式
+?      + 的非贪婪模式
??      ? 的非贪婪模式
{m}     匹配 m 个原子的序列                 如: a{2}  可匹配 aaa
{m,}    匹配 m 个或者更多原子的序列          如: a{2,} 可匹配 aaa、aaaaa...
{m,n}   匹配 m 到 n 个(包含两端) 原子的序列;m 不能比 n 大   如:a{2,3}   可匹配 aa、aaa
{m}?    {m} 的非贪婪模式
{m,}?   {m,} 的非贪婪模式
{m,n}?  {m,n} 的非贪婪模式

^       匹配字串的开头                       如:^aa   可匹配 aa 开头的任意字符
$       匹配字串的结尾                       如:b$    可匹配 b 结尾的任意字符,(abc)$ 可匹配 abc 结尾的任意字符
\n      匹配换行
\r      匹配回车
\t      匹配制表符

\d      匹配任意数字
\s      匹配空格
\w      匹配任意字母
\D      匹配非数字
\S      匹配非空格
\W      匹配非字母

[a-z]   匹配任意小写字母
[A-Z]   匹配任意大写字母
[^a-z]  匹配非小写字母
[^A-Z]  匹配非大写字母
[0-9]   匹配任意数字
[^0-9]  匹配非数字

一个方括弧表达式 [...] 声明一个字符表, 就像 POSIX 正则表达式一样
举例:
[abc]      可匹配 a 或 b 或 c 或 ab 或 ac 或 bc
[a]+       可匹配一个 a 或多个 a
[\d\.]+    可匹配一个数字或多个同时可匹配一个点. 或多个点.  ,\d 表示任意数字,\. 表示小数位点.
           也可写成:\d+\.+\d+
\k         把 k 当作一个普通字符看待(这里的 k 是非字母数字字符)   
           如:  \\   可匹配一个\  
                 \{   可匹配{

举例:select 'abc\def'::bytea;
结果:报错,这是因为对于反斜线无法强转为 bytea 字节类型,需要对反斜线转义使用双斜线 \\

select 'abc\\def'::bytea;
结果:成功,但由于是 bytea 字节类型无法被人为识别

select convert_from('abc\\def'::bytea,'utf-8');
结果:成功