注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

正则表达式之一: 用于查询过滤  

2011-03-22 13:48:48|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        

             今天有同事咨询有关数据检索方面的问题,是这样的,需要检索出一张表的字段值的内容
全部是数字并且长度为11的记录, 开始想了想,长度为11这很好控制,用个 char_length 函数
就行,但是要判断每一位都为数字,就不好判断了。好在PG里提供正则表达式,可以非常灵活地
解决这个问题,以下为详细步骤。

测试场景
--看一张测试表,里面有少量数据
skytf=> select * From test_27 order by id;
 id |    name    
----+-------------
  1 | 123
  2 | 123A
  3 | 12AAA
  4 | 123111111
  5 | 1234
  6 | 12311111111
(6 rows)


       那么如何过滤出 name 字段长度为11,且 name 字段内容全为数字的记录呢?
 看下面这个查询。


--查询 name 字段长度为11位,并且内容全为数字的记录。
skytf=> select * From test_27 where name ~ '^[0-9]{11}';
 id |    name    
----+-------------
  6 | 12311111111
(1 row)

  备注:上面检索条件中的大括号,表示检索范围。

            

正则表达式的基础知识

--1 正则表达式匹配操作符

操作符 描述 例子
~ 匹配正则表达式,大小写相关 'thomas' ~ '.*thomas.*'
~* 匹配正则表达式,大小写无关 'thomas' ~* '.*Thomas.*'
!~ 不匹配正则表达式,大小写相关 'thomas' !~ '.*Thomas.*'
!~* 不匹配正则表达式,大小写无关 'thomas' !~* '.*vadim.*'

 

--2 正则表达式原子

原子 描述
(re) (这里的 re 是任何正则表达式) 匹配一个对 re 的匹配,有可报告的匹配信息
(?:re) 同上,但是匹配不会被报告 (一个"不捕获"圆括弧) (只在 ARE 中有)
. 匹配任意单个字符
[chars] 一个 方括弧表达式, 匹配任意的字符(参阅 Section 9.7.3.2 获取更多细节)
\k (这里的 k 是非字母数字字符) 匹配一个当作普通字符看待的特定字符, 比如,\\ 匹配一个反斜杠
\c 这里的 c 是一个字母数字 (可能跟着其它字符),它是一个逃逸, 参阅 Section 9.7.3.3(仅存在于 ARE; 在 ERE 和 BRE 中,它匹配 c
{ 如果后面跟着一个字符,而不是数字, 那么就匹配左花括弧{;如果跟着一个数字, 那么它是范围的开始(见下面)
x 这里的 x 是一个没有其它特征的单个字符, 则匹配该字符

 

--3 正则表达式量词

量词 匹配
* 一个匹配 0 或者更多个原子的序列
+ 一个匹配 1 或者更多个原子的序列
? 一个匹配 0 个或者 1 个原子的序列
{m} 一个正好匹配 m 个原子的序列
{m,} 一个匹配m 个或者更多原子的序列
{m,n} 一个匹配 mn 个(包含两端) 原子的序列;m 不能比 n
*? * 的非贪婪模式
+? + 的非贪婪模式
?? ? 的非贪婪模式
{m}? {m} 的非贪婪模式
{m,}? {m,} 的非贪婪模式
{m,n}? {m,n} 的非贪婪模式

 

--4 正则表达式约束

约束 描述
^ 匹配字串的开头
$ 匹配字串的结尾
(?=re) 正前瞻 匹配任何匹配 re 的 子字串起始点(只在 ARE 中有)
(?!re) 负前瞻 匹配任何不匹配 re 的子字串的起始点。(只在 ARE 中有)

          上面只列出正则表达式的一些基础知识,正则表达式的检索能力相当强大,特别是对于类型为
Text类型,并且存储的是XML数据时,正则表达式的优势将更能发挥作用。关于更详细的信息可以参
考文档http://www.postgresql.org/docs/9.0/static/functions-matching.html

    本文参考文档:http://www.pgsqldb.org/pgsqldoc-8.1c/functions-matching.html#FUNCTIONS-POSIX-REGEXP

  评论这张
 
阅读(27135)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016