PostgreSQL正则表达式 - 用数字排除字符串

时间:2014-03-16 12:07:36

标签: regex postgresql

我开始使用Postgre Regular Expressions,开发PostgreSQL 8.3版本。

我有一张记录表如下:

record
-----------
a  
ab
abc  
123abc 
132abc
123ABC  
abc123
4567  
5678
6789  

我正在阅读一个简单的教程: www.oreillynet.com。 在我遇到以下问题之前,一切似乎都很清楚:

SELECT record FROM myrecords WHERE record ~ '[^0-9]';

tutorail说:

  

此表达式返回不包含数字的字符串。

但它在输出后返回给我:

output
------
a
ab
abc
123abc
132abc
123ABC
abc123

有人能解释一下这种行为吗?然后,我正在努力寻找该网站上的另一个表达式,试图在同一个字符串中排除包含数字和小写字母的字符串。

3 个答案:

答案 0 :(得分:11)

此命令:

SELECT record FROM myrecords WHERE record ~ '[^0-9]';

表示在record字段中应至少有一个非数字字符(这是正则表达式的含义)。

如果查找包含数字和小写字母的记录,那么我会期待一个正则表达式:

SELECT record FROM myrecords WHERE record ~ '[0-9a-z]';

将返回具有至少一个字母或数字或小写字母的所有记录。

如果您想获取没有数字的记录,那么您必须使用以下正则表达式:

SELECT record FROM myrecords WHERE record ~ '^[^0-9]+$';

这里,方括号外的^字符表示字段的开头,$字符表示字段的结尾,我们要求中间的所有字符都是非数字。 +表示至少应该有一个这样的字符。如果我们还允许空字符串,则正则表达式看起来像^[^0-9]*$

答案 1 :(得分:2)

另一个简单的解决方案:

SELECT record FROM myrecords WHERE record !~ '[0-9]';

答案 2 :(得分:1)

select 'a2' ~ '^[a-z]+$'; --false
select 'a' ~ '^[a-z]+$'; --true

'^[a-z]+$' =>仅检查从字符串开头(^)到字符串结尾(+ $)的字母a-z

如果要检查数字:'^[0-9]+$'

如果要检查数字和字符,请说“”。 :'^[0-9\.]+$',其中“ \”是转义字符