- 论坛徽章:
- 3
|
本帖最后由 osdba 于 2011-08-02 14:41 编辑
PostgreSQL有一个很强大的函数substring,可以使用正则表达式。很多人对这个函数具体怎么使用可能有一些疑惑。
substring有三种用法:
1. substring(<字符串>, <数字>,[数字])
后两个参数为数字,则这个函数与substr是一样的,也其它语言中的substr意义一样。
osdba=# select substring('osdba',2);
substring
-----------
sdba
(1 row)
2. substring(<字符串>,<字符串>)
有两个参数,都是字符串,这是一种使用正则式的方式。
在PostgreSQL中有两种正则表达式,一种称为SQL正则表达式模式,一种称为POSIX正则表达式。
POSIX正则表达式就是我们一般在脚本语言中使用的标准正则表达式,而SQL正则表达式首先是遵循SQL语句中的like的语法,如
字符“.”在POSIX正则表达式中代表任意字符,而在SQL表达式中就只能表示自己,而表示任意字符的元字符是“_”,
SQL正则表达式中“%”可以表过任意个字符,而这在POSIX正则表达式中需要用“.*”来表示。
同时在SQL正则表达式中也支持以下语法:
| 表示选择(两个候选之一),这个在POSIX正则表达式中不支持。
* 表示重复前面的项零次或更多次
+ 表示重复前面的项一次或更多次
() 把项组合成一个逻辑项
[...] 声明一个字符类
similar to 中使用的就是SQL正则表达式,而 “~”使用的是POSIX正则表达式,注意如下的区别:
osdba=# select 'osdba' ~ 'sdb';
?column?
----------
t
(1 row)
osdba=# select 'osdba' similar to 'sdb';
?column?
----------
f
(1 row)
osdba=# select 'osdba' similar to '%sdb%';
?column?
----------
t
(1 row)
以上可以看出SQL正则表达式要求是全部匹配才为真,而POSIX表达式中是只要包含就为真。
而只有两个参数的的substring中的正则表达式,就是使用POSIX的正则表达式。
见示例:
osdba=# select substring('osdba-5-osdba',E'(\\d+)');
substring
-----------
5
(1 row)
这种方式的substring函数返回正则表达式中“()”中匹配的部分。
3. substring(<字符串>,<字符串>,<字符串)或substring(<字符串> from <字符串> for <字符串)
这种形式的substring使用SQL正则表达式。第三个参数为指定一个转义字符。如下示例:
osdba=# select substring('osdba-5-osdba','%#"[0-9]+#"%','#');
substring
-----------
5
(1 row)
模式必须出现后跟双引号(")的两个转义字符。匹配“#"”这两个标记之间的模式的字符串将被返回。 |
|